这是一个使用旧式语法声明和定义的简单函数:
#include <stdio.h>
void
error(message,a1,a2,a3,a4,a5,a6,a7)
char *message;
char *a1,*a2,*a3,*a4,*a5,*a6,*a7;
{
fprintf(stderr,message,a1,a2,a3,a4,a5,a6,a7);
}
int main ()
{
error("[ERROR %d]: %s.\n",110,"Connection timed out");
return 0;
}
可以正确编译运行打印:
[ERROR 110]: Connection timed out.
我读到这个样式没有关联的原型(prototype),但它如何在运行时自动将 int 转换为 char *,甚至提供的参数比它声明的少?
最佳答案
基本上,它之所以有效,是因为它太笨了,无法更好地了解。老式的 K&R C 基本上不检查任何东西。你逃脱了,因为,
sizeof(int) == sizeof(char *)
在您使用的特定体系结构和编译器组合上发生。它并没有真正转换任何东西,它只是将 32 位计算为 32 位。当您将所有这些参数放入堆栈时,它只是将它们压入栈中。当 printf 使用它们时,它只在需要时使用那些参数,而不管其余的;然后,当电话返回时,它们就会消失,没有人会更聪明。但是,如果您碰巧尝试在只传递六个参数的情况下打印七个值,它会在运行时爆炸,有时会以创造性和意想不到的方式出现。
关于c - 旧式 C 函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581586/