Рассмотрим эти два определения функций:
void foo() { }
void foo(void) { }
Есть ли разница между этими двумя? Если нет, то почему существует аргумент void
? Эстетические причины?
Рассмотрим эти два определения функций:
void foo() { }
void foo(void) { }
Есть ли разница между этими двумя? Если нет, то почему существует аргумент void
? Эстетические причины?
В C:
void foo()
означает "функция foo
, которая принимает неопределенное число аргументов неуказанного типаvoid foo(void)
означает "функция foo
без аргументов" В С++:
void foo()
означает "функция foo
без аргументов" void foo(void)
означает "функция foo
без аргументов" Таким образом, мы пишем foo(void)
, чтобы достичь одинаковой интерпретации на обоих языках и сделать наши заголовки многоязычными (хотя обычно нам нужно делать несколько вещей в заголовках, чтобы сделать их по-настоящему кросс-языковыми, а именно, обернуть их a extern "C"
, если мы компилируем С++).
Я понимаю, что ваш вопрос относится к С++, но когда дело доходит до C, ответ можно найти в K & R, стр. 72-73:
Кроме того, если объявление функции не содержит аргументов, в
double atof();
что тоже означает, что ничего не следует предполагать аргументы atof; вся проверка параметров отключена. Этот специальный значение пустого списка аргументов предназначено для того, чтобы разрешить более старый C программы для компиляции с новыми компиляторами. Но это плохая идея использовать его с новыми программами. Если функция принимает аргументы, объявляйте их; если он не принимает аргументов, используйте void.
С++ 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/...
В C вы используете пустоту в пустой ссылке на функцию, чтобы у компилятора был прототип, и у этого прототипа нет аргументов. В С++ вам не нужно сообщать компилятору, что у вас есть прототип, потому что вы не можете оставить прототип.