Нечетный вывод компиляции
Я только что скомпилировал этот код:
void foo(int bar...) {}
int main()
{
foo(0, 1);
return 0;
}
И результат компиляции был действительно странным:
g++ test.c
Вывод:
Nothing
и
gcc test.c
Вывод:
test.c: 1:17: ошибка: ожидается ';', ',' или ')' перед '...' токеном
Я знаю, что нет параметра запятой после параметра, этот вопрос о странном выходе компиляции.
Я понимаю, почему это недопустимо в C, но не может понять, почему оно действительно в С++.
Ответы
Ответ 1
Другой ответ правилен (я поддерживаю), но просто для указания ссылки [8.3.5 Функции 3]:
параметр-объявление-предложение:
параметр декларирование-лист <суб > неавтоматическогосуб > ... <суб > неавтоматическогосуб >
parameter-declaration-list,...
Это означает, что запятая является необязательной в С++, но не в C. Вы также можете написать void foo(...)
в С++, потому что список объявления параметров также является необязательным.
В связи с тем, что в шаблонах С++ test(...)
распространен при использовании SFINAE для функции "catch-all". Однако в C нет использования для foo(...)
и, следовательно, это незаконно.
Ответ 2
Вещь С++ позволяет
returntype funcname(optional_param...)
для вариационных функций, а C - нет.
Ответ 3
Вы просто наткнулись на неясные различия между грамматиками языка C и С++. Да, С++ позволяет использовать ваш синтаксис, а C - нет. В С++ запятая перед ...
является необязательной, а в C всегда требуется. Это все, что нужно.
Ответ 4
В С++ не разрешена версия для запятой, чтобы разрешить f (...) Почему?
Рассмотрим void f() {}
В C это означает "я принимаю что-либо", а в С++ это означает "я ничего не принимаю". (void f (void) - это "Я ничего не принимаю" в C)
Чтобы объявить функцию C "Я принимаю что-нибудь" на С++, вам нужно написать extern "C" void f (...);