繁体   English   中英

为什么具有空参数列表的函数原型与具有char参数的函数原型冲突?

[英]Why does a function prototype with an empty argument list conflicts with one that has a char argument?

使用下面的代码,使用-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美元表示

函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息。

由此我得出结论,上面的代码实际上应该是有效的。 或者我错过了标准的其他相关部分?

C 2011(N1570)6.7.6.3 15:

要使两种函数类型兼容,两者都应指定兼容的返回类型。 此外,参数类型列表(如果两者都存在)应在参数的数量和省略号终止符的使用中一致; 相应的参数应具有兼容的类型。 如果一个类型具有参数类型列表而另一个类型由函数声明符指定,该函数声明符不是函数定义的一部分并且包含空标识符列表,则参数列表不应具有省略号终止符,并且每个参数的类型应为与应用默认参数促销产生的类型兼容 。... [强调添加。]

char被提升为int ,因此char a与空列表不兼容。 int a将; int foo(); int foo(int a); 被允许。

本质上,原因是,如果你声明一个函数int foo()然后调用它,比如用int foo(3) ,编译器必须知道传递它的内容。 从历史派生的规则是执行默认参数提升。 所以int foo(3)被调用就像它是int foo(int)

然后,如果稍后使用int foo(char)定义函数,则定义将与调用不匹配。 在许多C实现中, charint可以放在同一个地方用于调用函数,但是C实现可以做一些不同的事情。 floatdouble将是一个更大的冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM