发现用混合C的C++很难写出完全正确的程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <stdio.h> #include <stdlib.h> #include <stdexcept> using namespace std; struct A { A() { printf("A::A()/n"); } ~A() { printf("A::~A()/n"); } }; struct G { G() { printf("G::G()/n"); } ~G() { printf("G::~G()/n"); } }; G g; int main(int argc, char* argv[]) { if (argc < 2) return 1; A a; char szbuf[32]; // 这里不管分配多少,总有可能不够, gcc3.4 环境下 ret 可能大于 32, 内容被截断 int ret = snprintf(szbuf, sizeof(szbuf), "arg1=%s", argv[1]); printf("ret=%d, szbuf=%s/n", ret, szbuf); if (ret >= sizeof(szbuf)) { perror("snprintf"); exit(1); // 如果是在深层函数调用,除了 exit(), 可用的就只剩下 throw // 实际上 exit 有陷阱,exit 只析析构全局对象, // C++ 规范说 exit 只析析构全局对象,不保证可以析构局部对象 } char* psz; // 发现一个法宝,可以 sprintf 动态申请的内存 // 但是也可能失败 ret = asprintf(&psz, "%.*s", 1000000000000, argv[1]); if (ret < 0) { perror("snprintf"); throw bad_alloc(); // 这里没有陷阱,但是如果没有外层 try-catch, 会 terminate } return 0; } 难啊,想简单,好像只能用 sstream 了 |
[e01] 呵呵,关心程序过程本身,就好了。
还有setjmp longjmp C++中用的话问题也多