`f (void)` означает отсутствие параметров в С++ 11 или C?
В С++ 11 следующее объявление функции:
int f(void);
означает то же самое, что:
int f();
Список параметров, состоящий из одного неназванного параметра не зависящего от типа типа void, эквивалентен списку пустых параметров.
Я получаю (возможно, ложное) впечатление, что это старая функция, возможно, унаследованная от C?
Кто-нибудь знает историю или обоснование этого способа объявить функцию без параметров?
Ответы
Ответ 1
В С++ они означают одно и то же.
В C f(void)
отличается от f()
, becuse f()
означает "неуказанные параметры" - вы можете законно передавать что-либо (независимо от того, довольна ли функция при получении данных тем или нет, другое дело).
Ответ 2
В С++ оба являются одним и тем же.
В C, f()
означает, что мы не знаем, сколько параметров выполняет функция в этой точке. Это неуказанные параметры. И f(void)
означает, что эта функция не принимает никаких параметров.
Из стандарта C:
6.7.6.3 Объявление функций (включая прототипы)
6/Список типов параметров задает типы и может объявлять идентификаторы для параметры функции.
10/Частный случай неименованного параметра типа void
как единственный элемент в списке указывает, что функция не имеет параметров.
14/Список идентификаторов объявляет только идентификаторы параметров функции. Пустой список в объявлении функции, который является частью определения этой функции, указывает, что функция не имеет параметров. Пустой список в объявлении функции, который не является частью определения этой функции, указывает, что информация о количестве или типах параметров не указана.
И, как вы сказали, в стандарте С++:
8.3.5 Функции [dcl.fct]
4/Параметр-объявление-предложение определяет аргументы, которые могут быть указаны, и их обработка, когда вызывается функция. [Примечание: * параметр-объявление-предложение * используется для преобразования аргументов, указанных в вызове функции; см. 5.2.2. -end note] Если предложение parameter-declaration пусто, функция не принимает аргументов. Список параметров, состоящий из одного неназванного параметра не зависимого типа void
, эквивалентен пустым списку параметров.
Ответ 3
Это относится к С++ из C. В C f()
означает неизвестное число и тип параметров. Таким образом, в C без параметров есть f( void )
.
В С++ он избыточен: f()
и f( void )
означает то же самое - функцию, которая не имеет параметров.
Ответ 4
В С++ нет разницы. Однако это наследуется от C, где int f()
означает "функция, которая может принимать любое количество аргументов любых типов" и int f(void);
указывает функции, не принимающие аргументов.
Изменить. Как указал Angew, в C функция f() означает ", параметры которой неизвестны в этой точке". Это не значит, что он может принимать любое количество аргументов - близко к этому будет f(T arg, ...)
, где arg
есть хотя бы один именованный параметр до ...
, который принимает хотя бы один аргумент, arg
(как указано @hvd).
Ответ 5
Из "Истории С++" (1979-1991 гг. Бьярн Страуструп) в p11:
C с классами введено обозначение f (void) для функции f, что не принимает аргументов как контраст с f(), что в C объявляет функцию который может принимать любое количество аргументов любого типа без какого-либо типа проверить.
Однако позже сказано, что вскоре декларатору пустой функции было дано его очевидное значение, а новая конструкция - вид, устаревший на время. Я думаю, никто не беспокоился о его удалении после (или, возможно, уже был написан код с С++, который нуждался в поддержке).
В C:
Эта конструкция, однако, сыграла важную роль в стандартизации языка C, где функция прототипирования была заимствована непосредственно из С++. В этом случае f(void)
был полезен для поддержки существующего кода C (в котором понятие f()
уже зарезервировано, чтобы указать функцию, принимающую неопределенное количество аргументов).
До этого язык C не смог привязывать конкретные типы к каждому параметру, но только функции с неопределенным числом аргументов и с неопределенными типами были декларируемы с использованием формы f()
.