c - 旧式 C 函数声明

标签 c function coding-style runtime

这是一个使用旧式语法声明和定义的简单函数:

#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 基本上不检查任何东西。你逃脱了,因为,

  1. sizeof(int) == sizeof(char *) 在您使用的特定体系结构和编译器组合上发生。它并没有真正转换任何东西,它只是将 32 位计算为 32 位。

  2. 当您将所有这些参数放入堆栈时,它只是将它们压入栈中。当 printf 使用它们时,它只在需要时使用那些参数,而不管其余的;然后,当电话返回时,它们就会消失,没有人会更聪明。但是,如果您碰巧尝试在只传递六个参数的情况下打印七个值,它会在运行时爆炸,有时会以创造性和意想不到的方式出现。

关于c - 旧式 C 函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581586/

相关文章:

c - 使用 C 中的日历概念计算错误的日期

没有变量声明的大括号

Python:将函数应用于数据帧的多个子集(存储在字典中)

c - 是否可以编写一个函数,该函数返回一个指向与其参数中的函数不同的函数的指针?

c++ - 在 C/C++ 中,任何人都可以提供一些使用内联或宏编写小函数的经验法则吗?

使用 fork() 函数在 Linux 中创建进程

c - C 中的多精度无符号减法

javascript - 如何在 HTML 标签中显示 Javascript 函数?

coding-style - 减少,或显式递归?

java - 在一个方法中用大括号分隔代码段是不好的做法吗?