Существует правило совместимости типов функций N2310 6.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
. - person Eric Postpischil   schedule 12.10.2019