但是因为所有东西都在放入函数表时被转换为正确的函数类型,所以不会发出警告。
所以编译器无济于事。C 程序员施法过多。>_<
我无法确定这是否可以通过在 C 中传递函数参数的方式来保证。我想要做像 sprintf 这样的可变参数函数,必须是可以正确解析早期参数的情况,无论参数列表的末尾是什么?
从技术上讲,您有未定义的行为。但是它是为您的平台定义的,以使用标准的 C 调用约定(参见 Scott 的回答),或者直接映射到它们的东西(通常通过将前 N 个参数映射到一组特定的处理器寄存器)。
这也经常出现在可变参数列表中。例如,printf
声明如下:
int printf(const char* format, ...);
它的定义通常使用stdarg
系统来处理额外的参数,它看起来像:
#include <stdarg.h>
int printf(const char* format, ...)
{
va_list ap;
int result;
va_start(ap, format);
result = vprintf(format, ap);
va_end(ap);
return result;
}
如果您在具有标准 C 调用约定的平台上,该va_end(ap)
宏通常会变成无所事事。在这种情况下,您可以将额外的参数传递给函数。但是在某些平台上,va_end()
调用需要将堆栈恢复到可预测的状态(即调用之前的位置va_start
);在这些情况下,您的函数不会以它找到它的方式离开堆栈(它不会从堆栈中弹出足够多的参数),因此您的调用函数可能会在退出时崩溃,例如,当它获取一个虚假的返回值时地址。