f (пусто) удержанный от использования в современном C и C++ [дубликат]

67
задан Derek 13 September 2012 в 16:37
поделиться

4 ответа

В C объявление int f(void) означает интервал возврата функции, который не берет параметров. Объявление int f() означает интервал возврата функции, который берет любое количество параметров. Таким образом, если у Вас есть функция, которая не берет параметров в C, первый - корректный прототип.

В C++, я верю int f(void), удерживается от использования, и int f() предпочтен, поскольку это конкретно означает функцию, которая не берет параметров.

97
ответ дан Daniel Daranas 24 November 2019 в 14:35
поделиться

Добавить к ответу Chris, с помощью int f() - плохая практика в C, по моему опыту, так как Вы теряете способность компилятора сравнить объявление функции с его определением, гарантировать, что это назовут правильно.

, Например, следующий код является совместимым стандартами C:

#include <stdio.h>
void foo();
void bar(void) {
    foo();
}
void foo(int a) {
    printf("%d\n", a);
}

, Но это приводит к неопределенному поведению, так как a не был передан foo.

В C++, существует две версии foo: тот, который не берет аргументов и того, который берет int. Так bar завершает вызов неопределенной версии, которая привела бы к ошибке компоновщика (предполагающий, что нет никаких других определений foo нигде).

21
ответ дан Zach Hirsch 24 November 2019 в 14:35
поделиться

Ответы выше довольно корректны, но я связываюсь с превосходной страницей David Tribble, поскольку она дает большое объяснение на этом и многих других проблемах.

выделения:

C различает функцию, объявленную с пустым списком параметров и функцию, объявленную со списком параметров, состоящим из только пусто. Первый - несмоделированная функция, берущая неуказанное количество аргументов, в то время как последний является смоделированной функцией, берущей аргументы.

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

Для кода, который предназначается, чтобы быть скомпилированным или как C или как C++, лучшее решение этой проблемы состоит в том, чтобы всегда объявлять функции, берущие параметры с явным пустым прототипом.

Пустые прототипы функции являются устаревшей функцией в C99 (как они были в C89).

Редактирование: После рассмотрения стандарта, возможно, стоит отметить, что func (пустой) синтаксис не удержан от использования в C++, но это обычно рассматривало больше идиомы C-стиля. Я думаю большинство программистов на C++, на которых я натыкался, предпочитают пустой список параметров.

Редактирование 2: Добавляя кавычку из стандарта C++, разделите 8.3.5, абзац 2:

, "Если пункт объявления параметра пуст, функция не берет аргументов. Список параметров (пусто) эквивалентен пустому списку параметров. За исключением этого особого случая, пусто не будет тип параметра (хотя типы, полученные из пустоты, такой как пусто*, могут)".

нет никакого упоминания, что любая форма удерживается от использования. Еще раз спасибо к превосходному веб-сайту г-на Tribble для указания на меня к корректному разделу стандарта.

17
ответ дан Dan Olson 24 November 2019 в 14:35
поделиться

В C++, int f(void) действительно объявление устаревшее, которое является 100%-м эквивалентом int f(). Это та же подпись. void в этом контексте является столь же значительным как например, пробел. Это также означает, что они подчиняются Одному Правилу Определения (они не перегружаются), и Derived::f(void) переопределения Base::f().

не смешивают с материалом как f(const void), все же. Нет большого согласия, что означает такая странность.

-1
ответ дан hochl 24 November 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: