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 では、0またはのようなもの0Lであり、C でも同じである可能性があります。その定数の型がポインターより小さい場合、上位ビットががらくたで埋められるため、可変引数関数に渡すのは安全ではありません。

Linux の場合、execlp(1)man ページには次のように記載されています。

引数のリストは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 に答える