5

这个简单的片段使用 g++ 4.7.0 生成“函数调用中缺少哨兵”警告,如果编译为 Cand C++ 源代码。我相信这是编译器的错误,因为最终NULL值在那里。

#include <unistd.h>

int main() {
    execlp("mkdir", "mkdir", "-p", "test", NULL);
    return 0;
}

我对吗?

4

2 回答 2

9

不你错了。

在 C++ 中,NULL 类似于0or0L并且在 C 中可能相同。如果该常量的类型小于指针,则将其传递给可变参数函数是不安全的,因为高位将被垃圾填充。

在 Linux 上,execlp(1)手册页说:

参数列表必须由 NULL 指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针(char *) NULL

即便携地提供你需要做的哨兵:

    execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);

这就是 GCC 向您发出的警告。

于 2012-08-23T16:14:29.927 回答
0

从我的文档

since  these  are variadic functions, this pointer must be cast `(char *) NULL`.

尝试:

execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);
于 2012-08-23T16:15:19.360 回答