虚假的"函数调用中缺少哨兵"

Lor*_*one 4 c++ unix gcc g++ exec

这个简单的代码段使用g ++ 4.7.0生成"函数调用中缺少的标记"警告,如果编译为Cand C++源代码,则都会生成.我认为这是编译器的错误,因为最终NULL值存在.

#include <unistd.h>

int main() {
    execlp("mkdir", "mkdir", "-p", "test", NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对吗?

Jon*_*ely 8

不你错了.

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

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

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

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

    execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);
Run Code Online (Sandbox Code Playgroud)

这就是海湾合作委员会警告你的事情.