Нечетный вывод компиляции

Я только что скомпилировал этот код:

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 (...);