当我阅读 ISO/IEC 9899:TC3 6.9.1 -> 示例 13
并且注意:
extern int max(int a, int b)
{
return a > b ? a : b;
}
[...]
extern int max(a, b)
int a, b;
{
return a > b ? a : b;
}
这里 int a, b; 是参数的声明列表。这两种定义之间的区别在于,第一种形式充当原型声明,强制转换后续调用函数的参数,而第二种形式则没有。
所以我写了自己的测试代码来编译它。(我想通了,这两种方式都需要在之前声明,或者必须使用上面提到的类型定义的原型)
size_t foo (size_t a, size_t b);
int main(int argc, char** argv)
{
/*some call to foo*/
return 0;
}
所以我现在要问:这种方式之间是否存在与性能相关的差异:
size_t foo (a, b)
size_t a, b;
{
return a > b ? a : b;
}
和这个?
size_t foo (size_t a, size_t b)
{
return a > b ? a : b;
}
因为据我了解,这是有区别的,因为第一种方法避免了函数调用时的多次转换,因为它说不必转换为参数类型,因为它保证类型将是类型(在这种情况下)size_t
.
但是我很困惑,因为我发现原型在两种情况下都必须看起来相似,我认为原型是编译器对其进行处理的来源。
那么:到底有什么区别?如果有,为什么第一种方式很少(从未)见过?