如果编译为 Cand C++ 源代码,这个简单的代码片段会使用 g++ 4.7.0 生成“函数调用中缺少标记”警告。我相信这是编译器的错误,因为最终的 NULL
值(value)就在那里。
#include <unistd.h>
int main() {
execlp("mkdir", "mkdir", "-p", "test", NULL);
return 0;
}
我说得对吗?
最佳答案
不,你错了。
在 C++ 中 NULL 类似于 0
或 0L
并且在 C 中可能是相同的。如果该常量的类型小于指针那么它是不安全的将其传递给可变参数函数,因为高位将被垃圾填满。
在 Linux 上,execlp(1)
手册页说:
The list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast
(char *) NULL
.
即可移植地提供你需要做的哨兵:
execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);
这就是 GCC 警告您的内容。
关于c++ - 虚假 "missing sentinel in function call",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095865/