【发布时间】:2012-03-30 02:34:11
【问题描述】:
我像这样使用 va_list:
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")
前三个参数已正确传递给 foo,但在“345”完成的地方,
arg = va_arg(arg, const char*)
为 arg 设置一些其他的怪异值。
所以有什么问题。我使用 llvm3.0 作为编译器。
【问题讨论】:
-
好的,我这样做
foo("123", "234", "345", NULL)。我会测试它是否有效。 -
你真的应该传递
(char*)NULL,因为NULL可能被定义为一个普通的0,编译器无法隐式知道它是一个没有强制转换的指针值。如果sizeof(int) != sizeof(char *)在 64 位实现中并不少见,这一点尤其重要。 -
实际上不是这样。在 C11 中,§7.19
<stddef.h>声明 宏是NULL,它扩展为实现定义的空指针常量; 所以只有损坏的实现才能以不等效的方式定义 NULL到一个空指针。 §7.17<stddef.h>部分 C99 中的措辞是相同的,我相信 C89 也基本相同。 -
@JonathanLeffler 嗯,你提出了一个有趣的观点。我在回想c-faq.com/null/macro.html,这通常是相当可靠的(尽管有点迂腐),但在他们的回答中并不清楚它可能是一个普通的 0。
-
echo "#include <stddef.h>\nNULL" | gcc -E -x c -=>((void *)0)而echo "#include <stddef.h>\nNULL" | gcc -E -x c++ -=>__null。 Ubuntu 12.04 x86_64 上的 gcc 4.6.3。另见c-faq.com/null/safermacs.html
标签: c variadic-functions