Рассмотрим эти определения две функции:Есть ли разница между foo (void) и foo() в C++ или C?
void foo() { }
void foo(void) { }
Есть ли разница между этими двумя? Если нет, то почему аргумент void
? Эстетические причины?
Рассмотрим эти определения две функции:Есть ли разница между foo (void) и foo() в C++ или C?
void foo() { }
void foo(void) { }
Есть ли разница между этими двумя? Если нет, то почему аргумент void
? Эстетические причины?
В С:
void foo()
означает "функция foo
принимает неопределенное количество аргументов неопределенного типа"void foo(void)
означает "функции foo
не принимает никаких аргументов"В C++:
void foo()
означает «функция foo
не принимает никаких аргументов»void foo(void)
означает «функцию foo
не принимая никаких аргументов»Написав foo(void)
, поэтому мы достигаем ту же интерпретацию на обоих языках и сделайте наши заголовки многоязычными (хотя нам обычно нужно сделать еще несколько вещей в заголовках, чтобы сделать их по-настоящему кросс-языковыми; а именно, обернуть их в extern "C"
, если мы скомпилируем C++).
В C вы используете пустоту в пустой ссылке на функцию, чтобы у компилятора был прототип, а у прототипа «нет аргументов». В C++ вам не нужно сообщать компилятору, что у вас есть прототип, потому что вы не можете оставить прототип.
«Прототип» означает список декларации аргументов и тип возвращаемого значения. Я говорю это, потому что «прототип» смутил меня по поводу того, что вы имели в виду в первую очередь. – 2008-10-01 19:48:34
Я понимаю, что ваш вопрос относится к 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: declarators говорит:
8.3.5 Изменение: В C++, функция, объявленная с пустым списком параметров не принимает никаких аргументов. В C пустой список параметров означает, что количество и тип аргументов функции неизвестны.
Пример:
int f(); // means int f(void) in C++ // int f(unknown) in C
Обоснование: Это позволяет избежать ошибочных вызовов функций (т.е. вызовы функций с неправильным числом или типом аргументов ).
Влияние на оригинальную функцию: изменение семантики четко определенной функции. Эта особенность была отмечена как «устаревший» в С.
8.5.3 Функция говорит:
4. Параметр декларирование придаточного определяет аргументы, которые могут быть определены, и их обработка , когда вызывается функция. [...] Если предложение parameter-declaration пустое, функция не принимает аргументов. Список параметров (void) эквивалентен списку пустых параметров.
C99
Как упомянуто C++ 11, int f()
не указывает ничего о доводах, и устаревшее.
Это может привести либо к рабочему коду, либо к UB.
Я интерпретировал стандарт C99 подробно на: https://stackoverflow.com/a/36292431/895245
Но если C++ потребовал `void`, то он мог бы избежать проблемы с« самым неприятным анализом ». – 2010-01-04 17:47:29
Правда, но в C++ так много других дерьмовых парсов, нет никакой реальной точки в kvetching о любом из них. – DrPizza 2010-01-04 18:49:00