C++ “失踪”;“失踪哨兵”;C+中的exec警告+;11

C++ “失踪”;“失踪哨兵”;C+中的exec警告+;11,c++,gcc,c++11,compiler-warnings,C++,Gcc,C++11,Compiler Warnings,如果您忘记在调用以下函数之一的末尾包含NULL sentinel,GCC将发出有益的警告: #include <unistd.h> int main(int argc, char **argv) { execlp("test", "test", "arg1"); } 但是,如果在C++11模式下编译,则不会打印诊断: $ g++ test.cc -std=c++11 -Wformat $ 为什么此警告在C++11中不可用?有没有办法把它取回来?execlp不是标准的C函数。为

如果您忘记在调用以下函数之一的末尾包含NULL sentinel,GCC将发出有益的警告:

#include <unistd.h>
int main(int argc, char **argv)
{
  execlp("test", "test", "arg1");
}
但是,如果在C++11模式下编译,则不会打印诊断:

$ g++ test.cc -std=c++11 -Wformat
$

为什么此警告在C++11中不可用?有没有办法把它取回来?

execlp
不是标准的C函数。为了让编译器将其识别为“标准”函数(它知道参数应该是什么样子),您需要
-std=gnu++11
而不是
-std=c++11
。请注意,默认值是
-std=gnu++98
。Glibc可以通过在
execlp

的声明中指定
sentinel
属性来改善这种情况
-std=c++98
。显然,您需要类似
-std=gnuXX
(默认值为98)的东西。事实上,
-std=gnu11
会带回警告。
$ g++ test.cc -std=c++11 -Wformat
$