#include <setjmp.h> #include <向量> int main(int argc, char**) { std::vector<int> foo(argc); jmp_buf 环境; 如果(setjmp(env))返回1; }
使用 GCC 4.4.1 编译上述代码 g++ test.cc -Wextra -O1 会给出这个令人困惑的警告:
/usr/include/c++/4.4/bits/stl_vector.h:在函数'int main(int,char**)'中: /usr/include/c++/4.4/bits/stl_vector.h:1035:警告:变量“__first”可能被“longjmp”或“vfork”破坏
stl_vector.h 的第 1035 行位于我在构造 foo 时调用的 vector(n, value) 构造函数使用的辅助函数中。如果编译器可以计算出参数值(例如,它是一个数字文字),警告就会消失,所以我在这个测试用例中使用 argc 因为编译器无法确定它的值。
我猜这个警告可能是因为编译器优化了向量构造,所以它实际上发生在 setjmp 着陆点之后(当构造函数参数依赖于函数的参数时,这似乎是这种情况)。
我怎样才能避免这个问题,最好不必将 setjmp 部分分解为另一个函数?
不使用 setjmp 不是一个选项,因为我被一堆需要使用它来处理错误的 C 库所困。