我正在研究ANSI C。这个应该编译吗?此代码是否符合更新的标准?(它尝试过,但总是出错(
#include <stdio.h>
#include <stdlib.h>
float declaration();
float prototype(float);
int main(void)
{
printf("declaration: %fn", declaration(10));
printf("prototype: %fn", prototype(10));
return 0;
}
float declaration(float x)
{
return x;
}
float prototype(float x)
{
return x;
}
我得到一个与-ansi -pedantic-errors -pedantic
:冲突的类型错误
gcc.exe -Wall -g -pedantic-errors -pedantic -ansi -save-temps -c main.c -o main.o
gcc.exe -o out.exe main.o
main.c:18:7: error: conflicting types for 'declaration'
18 | float declaration(float x)
| ^~~~~~~~~~~
main.c:19:1: note: an argument type that has a default promotion cannot match an empty parameter name list declaration
19 | {
| ^
main.c:5:7: note: previous declaration of 'declaration' was here
5 | float declaration();
| ^~~~~~~~~~~
让我困惑的是,标准上写着:
6.2.1标识符的范围。。。函数原型是一个函数的声明,它声明了其参数的类型。
这可能意味着你可以声明一个没有它们的函数。。。
谢谢!
这不应该编译,因为如果您在同一范围内有一个旧式函数声明和一个原型,那么在默认参数升级后,所有参数类型都必须与其兼容。CCD_ 2不是这样的类型,因为它提升为CCD_。
如果一个类型具有参数类型列表,而另一个类型由函数声明符指定,该声明符不是函数定义的一部分,并且包含空标识符列表,则参数列表不应具有省略号终止符,并且每个参数的类型应与应用默认参数提升(链接(产生的类型兼容。
所以:
float declaration();
float declaration(float x) { return x; } // fail
float declaration2();
float declaration2(double x) { return x; } // ok
如果你干扰了的通话
declaration2(10);
在声明和declaration2
的定义之间,这是未定义的行为,但不是可诊断的错误。为了使调用有效,您需要在调用站点看到原型,或者实际的参数类型应该与参数类型兼容(在默认参数升级之后(。对于int
和double
,情况并非如此。