这个简单的片段使用 g++ 4.7.0 生成“函数调用中缺少哨兵”警告,如果编译为 Cand C++ 源代码。我相信这是编译器的错误,因为最终NULL
值在那里。
#include <unistd.h>
int main() {
execlp("mkdir", "mkdir", "-p", "test", NULL);
return 0;
}
我对吗?
不你错了。
在 C++ 中,NULL 类似于0
or0L
并且在 C 中可能相同。如果该常量的类型小于指针,则将其传递给可变参数函数是不安全的,因为高位将被垃圾填充。
在 Linux 上,execlp(1)
手册页说:
参数列表必须由 NULL 指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针
(char *) NULL
。
即便携地提供你需要做的哨兵:
execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);
这就是 GCC 向您发出的警告。
从我的文档:
since these are variadic functions, this pointer must be cast `(char *) NULL`.
尝试:
execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);