Определение функции с помощью многоточия - PullRequest
1 голос
/ 10 апреля 2019

Я неправильно понял семантику функций с переменным числом аргументов. 6.5.2.2(p6)

Если функция определена с типом, который включает в себя прототип, и либо прототип заканчивается многоточием (, ...) или типы аргументов после продвижения не совместимы с типы параметров, поведение не определено.

Это не совсем понятно. Заканчивается ли в определении функции ниже прототипа многоточием?

void foo(int i, ...){
    //...
}

Сначала я подумал, что речь идет о функции, в которой список параметров содержит только многоточие, например

void foo(...){
    //...
}

но этот случай описывается 6.9.1(p8):

Если определена функция, которая принимает переменное число аргументов без списка типов параметров, который заканчивается многоточием, поведение не определено

Так что я не совсем понимаю, что они имели в виду под

либо прототип заканчивается многоточием (, ...)

в 6.5.2.2(p6)

1 Ответ

5 голосов
/ 10 апреля 2019

В этом параграфе обсуждается случай, когда выражение вызова функции упоминает функцию, для которой не было обнаружено ни одного прототипа.В этом случае компилятор должен угадать типы своих параметров, основываясь на типах аргументов вызова.

Если эта функция определена (возможно, в другой единице перевода) как переменная или с параметромтипы, которые не соответствуют предположению компилятора, поведение не определено.

...