Подтвердить что ты не робот

`f (void)` означает отсутствие параметров в С++ 11 или C?

В С++ 11 следующее объявление функции:

int f(void);

означает то же самое, что:

int f();

Список параметров, состоящий из одного неназванного параметра не зависящего от типа типа void, эквивалентен списку пустых параметров.

Я получаю (возможно, ложное) впечатление, что это старая функция, возможно, унаследованная от C?

Кто-нибудь знает историю или обоснование этого способа объявить функцию без параметров?

4b9b3361

Ответ 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().