如果您在调用其中一个exec(3)函数时忘记包含NULL标记,GCC将会提醒您:
#include <unistd.h>
int main(int argc, char **argv)
{
execlp("test", "test", "arg1");
}
GCC 4.8的示例编译器输出:
$ g++ test.cc -Wformat
test.cc: In function ‘int main(int, char**)’:
test.cc:4:32: warning: missing sentinel in function call [-Wformat=]
execlp("test", "test", "arg1");
^
$
但是,如果在C ++ 11模式下编译,则不会打印诊断信息:
$ g++ test.cc -std=c++11 -Wformat
$
为什么C ++ 11中没有此警告?有没有办法让它回来?
答案 0 :(得分:4)
execlp
不是标准的C函数。让编译器将其识别为&#34;标准&#34;函数,它知道参数应该是什么样的,你需要-std=gnu++11
而不是-std=c++11
。请注意,默认值为-std=gnu++98
。 Glibc可以通过在sentinel
声明中指定execlp
属性来改善这种情况。