gpt4 book ai didi

c - 为什么具有空参数列表的函数原型(prototype)与具有 char 参数的函数原型(prototype)冲突?

转载 作者:太空狗 更新时间:2023-10-29 14:53:18 25 4
gpt4 key购买 nike

在下面的代码中,使用 -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 ), section 6.7.6.3, $14 说

The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.

由此我得出结论,上面的代码实际上应该是有效的。还是我遗漏了标准的其他一些相关部分?

最佳答案

C 2011 (N1570) 6.7.6.3 15:

For two function types to be compatible, both shall specify compatible return types. Moreover, the parameter type lists, if both are present, shall agree in the number of parameters and in use of the ellipsis terminator; corresponding parameters shall have compatible types. If one type has a parameter type list and the other type is specified by a function declarator that is not part of a function definition and that contains an empty identifier list, the parameter list shall not have an ellipsis terminator and the type of each parameter shall be compatible with the type that results from the application of the default argument promotions.… [Emphasis added.]

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 实现中,一个 char 和一个 int 可以放在同一个地方来调用函数,但 C 实现可以做一些不同的事情。 floatdouble 会产生更大的冲突。

关于c - 为什么具有空参数列表的函数原型(prototype)与具有 char 参数的函数原型(prototype)冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com