【发布时间】:2020-12-03 02:43:41
【问题描述】:
我注意到 C 中有一些我不太理解的行为。如果我使用未指定类型的参数定义函数并在没有任何参数的情况下调用它,则代码会编译但会发出警告,指出参数的类型默认为 int。
void f(i) {
printf("%d", i);
}
int main(void) {
f();
}
如果我 run this on godbolt,我会收到预期的编译器警告,并且执行会将 1 打印到 stdout。
但是,如果我定义了相同的方法,但将参数显式声明为 int,编译器会因参数太少而调用的函数引发错误。
void f(int i) {
printf("%d", i);
}
int main(void) {
f();
}
Compiling this on godbolt 产生error: too few arguments to function 'f'。
这种行为在所有现代版本的 gcc 和 clang 中都是一致的。为什么指定参数的类型会使这成为编译器错误?另外,是否定义了第一个示例的行为? gcc 和 clang 总是使 i 1 的事实让我认为这是故意的。如果有,为什么?
【问题讨论】:
-
我敢打赌这与古代 K&R C 有关(看起来像
void f(i) int i { ... })
标签: c compilation