【发布时间】:2014-03-18 11:36:50
【问题描述】:
使用下面的代码,使用 -std=c11 调用的 clang 和 gcc 都抱怨 foo 的类型冲突。
int foo();
int main(void) {
return foo(0);
}
int foo(char a) {
return a;
}
根据https://stackoverflow.com/a/13950800/1078224 中的答案,在(旧的?)C 标准中,当没有给出变量类型时,假定类型 int。但是,C11 标准草案 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf),第 6.7.6.3 节,$14 说
函数声明器中的空列表不属于 该函数的定义指定没有关于函数的数量或类型的信息 提供参数。
由此我得出结论,上面的代码实际上应该是有效的。还是我错过了标准的其他相关部分?
【问题讨论】:
-
令人困惑的事实是总是使用原型的另一个论据。
-
注意行号——错误在函数definition的行,而不是函数call的行。 ideone.com/mi5Eq2
-
隐式
int规则在 1999 年标准中被删除。