2008-09-09 1 views

ответ

263

В С:

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

В C++:

  • void foo() означает «функция foo не принимает никаких аргументов»
  • void foo(void) означает «функцию foo не принимая никаких аргументов»

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

+4

Но если C++ потребовал `void`, то он мог бы избежать проблемы с« самым неприятным анализом ». – 2010-01-04 17:47:29

+4

Правда, но в C++ так много других дерьмовых парсов, нет никакой реальной точки в kvetching о любом из них. – DrPizza 2010-01-04 18:49:00

1

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

+1

«Прототип» означает список декларации аргументов и тип возвращаемого значения. Я говорю это, потому что «прототип» смутил меня по поводу того, что вы имели в виду в первую очередь. – 2008-10-01 19:48:34

31

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

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

double atof(); 

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

4

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