Есть ли разница между foo (void) и foo () в C ++ или C?

226

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

void foo() { }

void foo(void) { }

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

  • 0
    Для C Q / A здесь
Теги:
arguments

4 ответа

295
Лучший ответ

В C:

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

В С++:

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

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

  • 6
    Но если бы C ++ требовал void , то он мог бы избежать проблемы «самого неприятного анализа».
  • 5
    Да, но в C ++ есть много других паршивых разборов, и нет смысла в этом говорить.
Показать ещё 11 комментариев
34

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

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

double atof();

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

  • 0
    Но вопрос касается определений, в этом случае соответствующее правило C является пустым списком в объявителе функции, который является частью определения этой функции и указывает, что функция не имеет параметров.
5

С++ 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: https://stackoverflow.com/questions/693788/is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo

2

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

  • 1
    «прототип» означает объявление списка аргументов и возвращаемый тип. Я говорю это потому, что «прототип» сбил меня с толку относительно того, что вы имели в виду вначале.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню