Есть ли разница между foo (void) и foo() в С++ или C?

Рассмотрим эти два определения функций:

void foo() { }

void foo(void) { }

Есть ли разница между этими двумя? Если нет, то почему существует аргумент void? Эстетические причины?

Ответ 1

В C:

  • void foo() означает "функция foo, которая принимает неопределенное число аргументов неуказанного типа
  • void foo(void) означает "функция foo без аргументов"

В С++:

  • void foo() означает "функция foo без аргументов"
  • void foo(void) означает "функция foo без аргументов"

Таким образом, мы пишем foo(void), чтобы достичь одинаковой интерпретации на обоих языках и сделать наши заголовки многоязычными (хотя обычно нам нужно делать несколько вещей в заголовках, чтобы сделать их по-настоящему кросс-языковыми, а именно, обернуть их a extern "C", если мы компилируем С++).

Ответ 2

Я понимаю, что ваш вопрос относится к С++, но когда дело доходит до C, ответ можно найти в K & R, стр. 72-73:

Кроме того, если объявление функции не содержит аргументов, в

double atof();

что тоже означает, что ничего не следует предполагать аргументы atof; вся проверка параметров отключена. Этот специальный значение пустого списка аргументов предназначено для того, чтобы разрешить более старый C программы для компиляции с новыми компиляторами. Но это плохая идея использовать его с новыми программами. Если функция принимает аргументы, объявляйте их; если он не принимает аргументов, используйте void.

Ответ 3

С++ 11 Стандартная черновая версия N3337

Нет никакой разницы.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Приложение C "Совместимость" C.1.7 Пункт 8: деклараторы говорят:

8.3.5 Изменение: в С++ функция, объявленная с пустым списком параметров, не принимает аргументов. В C пустая Список параметров означает, что количество и тип аргументов функции неизвестны.

Пример:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

Обоснование: это во избежание ошибочных вызовов функций (т.е. вызовов функций с неправильным числом или типом аргументы).

Влияние на оригинальную функцию: переход к семантике четко определенной функции. Эта функция была отмечена как "устаревшая" в C.

8.5.3 функции говорят:

4. Параметр-объявление-предложение определяет аргументы, которые могут быть указаны, и их обработка, когда функция вызывается. [...] Если предложение parameter-declaration пусто, функция не принимает аргументов. Список параметров (void) эквивалентен списку пустых параметров.

C99

Как упоминалось в С++ 11, int f() ничего не говорит о аргументах и ​​устаревает.

Это может привести либо к рабочему коду, либо к UB.

Я подробно рассмотрел стандарт C99: fooobar.com/questions/22916/...

Ответ 4

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