Есть ли разница между foo (void) и foo () в C ++ или C? - PullRequest
236 голосов
/ 09 сентября 2008

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

void foo() { }

void foo(void) { }

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

Ответы [ 4 ]

300 голосов
/ 09 сентября 2008

In C :

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

In C ++ :

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

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

37 голосов
/ 09 сентября 2008

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

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

double atof();

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

9 голосов

C ++ 11 N3337 стандартная тяга

Разницы нет.

http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 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. Параметр-объявление-предложение определяет аргументы, которые могут быть указаны, и их обработку, когда функция называется. [...] Если параметр-объявление-предложение пуст, функция не принимает аргументов Список параметров (void) эквивалентен пустому списку параметров.

C99

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

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

Я подробно интерпретировал стандарт C99 по адресу: https://stackoverflow.com/a/36292431/895245

2 голосов
/ 09 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...