この単純なスニペットは、g++ 4.7.0 で「関数呼び出しにセンチネルがありません」という警告を生成します。両方とも、Cand C++ ソースとしてコンパイルされている場合です。NULL
最終的な値がそこにあるので、コンパイラのエラーだと思います。
#include <unistd.h>
int main() {
execlp("mkdir", "mkdir", "-p", "test", NULL);
return 0;
}
私は正しいですか?
いいえ、違います。
C++ NULL では、0
またはのようなもの0L
であり、C でも同じである可能性があります。その定数の型がポインターより小さい場合、上位ビットががらくたで埋められるため、可変引数関数に渡すのは安全ではありません。
Linux の場合、execlp(1)
man ページには次のように記載されています。
引数のリストは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);