私はこのようにva_listの使用:va_listのとのva_arg
void foo(const char* firstArg, ...) {
va_list args;
va_start (args, firstArg);
for (const char* arg = firstArg; arg != NULL; arg = va_arg(arg, const char*)) {
// do something with arg
}
va_end(args);
}
のfoo( "123"、 "234"、 "345")
最初の3つの引数が正しくfooへの渡されましたが、ここで " 345" は
arg = va_arg(arg, const char*)
が引数にいくつかの他のフリーク値を設定し、実行されます。
だから何が問題なのですか?私はコンパイラとしてllvm3.0を使用しています。
OK、私はこの 'foo(" 123 "、" 234 "、" 345 "、NULL)'のようにします。私はそれが動作するかどうかをテストします。 – holsety
'(char *)NULL'は実際に渡すべきです。' NULL'はプレーンな0として定義され、コンパイラはキャストのないポインタ値を暗黙的に知る方法がありません。これは、sizeof(int)!= sizeof(char *) 'が64ビット実装で珍しくない場合に特に重要です。 – FatalError
実際はそうではありません。 C11では、§7.19の ''は、マクロが NULLであることを示しています。実装定義のNULLポインタ定数に展開される _壊れた実装だけが、NULLポインタと等価でない方法でNULLを定義できる。セクション§7.17の「」のC99の文言は同じで、C89も本質的に同じだと私は信じています。 –