如果省略函数原型的参数类型(在 C 中)会发生什么情况



发生了什么 在编译和链接过程中,如果省略了参数类型(考虑到定义的函数采用参数)? 编译器是否只会将缺少参数的原型标记为语法错误?

编辑

所以我发现它构建并运行

#include<stdio.h>
float addf(a,b); // even without a,b it runs
int main(){
float input1 = 10.0;  
float input2 = 20.0;
printf("%f + %f = %f", input1, input2, addf(input1, input2) );
getchar();
return 0;
}
float addf(float a, float b){
return a + b;
}

result : 10.000000 + 20.000000 = 2.562500

知道为什么以这种方式执行吗?

问题中的措辞有误。不能省略函数原型中的类型。如果省略函数定义、声明中的类型,则它没有原型。只有包含函数类型(无论是void)的声明,定义才有原型


当您省略函数定义中的类型时,您将获得旧的 style*声明列表。您必须在函数体之前指定参数的类型,可在此处查看其示例。调用方无法知道如何正确调用此函数,并且编译器无法检查。标量类型受默认参数升级的约束,就像原型函数的变量参数部分一样。


至于您问题中的代码,它不符合标准 - 实际上,存在 2 个严重错误:

float addf(a,b); // even without a,b it runs

是一个不正确的声明,这是 C 不允许的 - 你必须写

float addf();  // empty parentheses

b,实际参数必须为double类型,因为默认参数 promotions 将转换它们。

相关内容

最新更新