【发布时间】:2019-10-12 10:09:26
【问题描述】:
函数类型兼容性有一个规则N23106.7.6.3(p15):
如果一种类型有参数类型列表,而另一种类型已指定 由不属于函数定义的函数声明符和 包含空标识符列表的参数列表不应 有一个省略号终止符,每个参数的类型应为 与从应用程序产生的类型兼容 默认参数提升。
我可以想象一个例子:
#include <stdio.h>
int foo();
float bar();
int main(void){
printf("%d\n", foo(1, 3)); //fine, int is unchanged by default argument promotion
printf("%f\n", bar(1.0f, 2.0f)); //error, float is promoted to double
}
int foo(int a, int b){
return a + b;
}
float bar(float b, float c){
return b + c;
}
我发现矛盾的是6.5.2.2(p6) 提到:
如果参数的数量不等于参数的数量, 行为未定义。
对于int foo(),它有一个空的identifier-list。那么调用 printf("%d\n", foo(1, 3)); 是否会产生 UB(提供了 2 个参数)?
无论如何,这些规则看起来很奇怪,有点不自然。那是什么原因呢?我想与以前版本的标准有一些向后兼容性......?
【问题讨论】:
-
在
bar(1.0, 2.0)、1.0和2.0中不会提升为double。他们是double。
标签: c language-lawyer function-call