在 C(C99 之前)中,您不必为了使用它们而声明函数。编译器将假定该函数采用您传递给它的提升参数类型,并假定该函数返回一个int
. 然而,这可能会产生很大的问题,如果函数没有,则行为是不确定的。让我们看看这个:
/* file1.c */
void foo(char a, char b) {
/* doing something ... */
}
/* main.c */
int main(void) {
char a = 'a', b = 'b';
/* char variables are promoted to int
before being passed */
foo(b, a);
}
因为如果在调用函数时没有声明函数,则类型会被提升(char -> int, float -> double
),所以参数无法再在内存中的正确位置传递。访问 b 可能会产生一个奇怪的参数值。作为一个侧节点,当您将参数传递给vararg functions
likeprinft
或没有原型的函数(like void f()
,其中没有关于参数类型和计数的信息)时,也会出现同样的问题。这就是您始终必须va_arg
使用其提升类型来访问可变参数的原因。如果你不这样做,GCC 会警告你。
始终包含正确的头文件,这样您就不会遇到这个问题。
编辑:感谢 Chris 指出char literals
(like 'a'
) 始终是int
C中的类型