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

StackOverflow https://stackoverflow.com/questions/51032

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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++ вам не нужно сообщать компилятору, что у вас есть прототип, потому что вы не можете его пропустить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top