Есть ли разница между foo(void) и foo() в C++ или C?
Вопрос
Рассмотрим эти два определения функций:
void foo() { }
void foo(void) { }
Есть ли разница между этими двумя?Если нет, то почему void
аргумент там?Эстетические причины?
Решение
В С:
void foo()
означает «функцияfoo
принимая неопределенное количество аргументов неопределенного типа"void foo(void)
означает «функцияfoo
не принимая аргументов»
В С++:
void foo()
означает «функцияfoo
не принимая аргументов»void foo(void)
означает «функцияfoo
не принимая аргументов»
Написав foo(void)
, поэтому мы добиваемся одинаковой интерпретации на обоих языках и делаем наши заголовки многоязычными (хотя обычно нам нужно сделать с заголовками еще кое-что, чтобы сделать их действительно межъязыковыми;а именно, завернуть их в extern "C"
если мы компилируем C++).
Другие советы
Я понимаю, что ваш вопрос относится к C++, но когда дело касается C, ответ можно найти в K&R, страницы 72-73:
Кроме того, если объявление функции не включает аргументы, как в
double atof();
Это также считается, чтобы означать, что ничего не следует предположить об аргументах AtoF;вся проверка параметров отключена.Это особое значение пустого списка аргументов предназначено для того, чтобы позволить более старым программам C компилировать с новыми компиляторами.Но это плохая идея использовать его с новыми программами.Если функция принимает аргументы, объявите их;Если это не требует аргументов, используйте void.
Черновик стандарта C++11 N3337
Нет никакой разницы.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Приложение C «Совместимость» C.1.7 Пункт 8:деклараторы говорит:
8.3.5 Изменение:В C++ функция, объявленная с пустым списком параметров, не принимает аргументов.В C пустой список параметров означает, что число и тип аргументов функции неизвестны.
Пример:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Обоснование:Это следует избегать ошибочных вызовов функции (то есть функциональных вызовов с неправильным номером или типом аргументов).
Влияние на исходную функцию:Переход к семантике четко определенного признака.Эта функция была отмечена как «устаревшая» в C.
8.5.3 функции говорит:
4.Удар по декларации параметров определяет аргументы, которые могут быть указаны, и их обработка, когда вызывается функция....] Если параметры декларации пуст, функция не принимает аргументов.Список параметров (void) эквивалентен пустому списку параметров.
С99
Как упоминалось в C++11, int f()
ничего не указывает на аргументы и является устаревшим.
Это может привести либо к рабочему коду, либо к UB.
Я подробно интерпретировал стандарт C99 по адресу: https://stackoverflow.com/a/36292431/895245
В C вы используете void в пустой ссылке на функцию, чтобы у компилятора был прототип, и этот прототип не имеет «аргументов».В C++ вам не нужно сообщать компилятору, что у вас есть прототип, потому что вы не можете его пропустить.