这个简单的代码段使用g ++ 4.7.0生成“函数调用中缺少的标记”警告,两者都编译为Cand C ++源代码。我认为这是编译器的错误,因为最终NULL
值就在那里。
#include <unistd.h>
int main() {
execlp("mkdir", "mkdir", "-p", "test", NULL);
return 0;
}
我是对的吗?
答案 0 :(得分:8)
不,你错了。
在C ++中,NULL类似于0
或0L
,在C中可能是相同的。如果该常量的类型小于指针,那么将它传递给可变参数是不安全的。功能,因为高位将填充垃圾。
在Linux上,execlp(1)
手册页说:
参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针{。{1}}。
即。便携地提供你需要做的哨兵:
(char *) NULL
这就是海湾合作委员会警告你的事情。
答案 1 :(得分:0)
来自我的documentation:
since these are variadic functions, this pointer must be cast `(char *) NULL`.
尝试:
execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);