C / C ++ - как (void) используется не как параметр? [Дубликат]

0

Я видел некоторый код в C/C++, который выглядит следующим образом:

void Main(void)

А также

int Main(void)

Каковы причины этого: почему это не параметр, а используется в круглых скобках после имени void/int и т.д.?

  • 0
    Это восходит к C. Этот вопрос повторяет stackoverflow.com/questions/9545208/…
  • 2
    Это один из тех вопросов, ответ на который зависит от того, имеете ли вы в виду C или C ++. Нет такого понятия, как язык C / C ++.
Показать ещё 1 комментарий
Теги:
void

6 ответов

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

В C (void) означает, что в вызове функции нет аргументов, а () означает неопределенное количество аргументов. В C++. () означает то же, что и (void)

Вот что говорит C-стандарт

5.1.2.1 Внештатная среда

В автономной среде (в которой выполнение программы C может иметь место без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются в соответствии с реализацией./../Эффект завершения программы в автономной среде определяется реализацией.

5.1.2.2 Хостинговая среда

Не рекомендуется предоставлять размещенную среду, но она должна соответствовать следующим спецификациям, если они есть.

5.1.2.2.1 Запуск программы

Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата int и без параметров:

int main(void) { /* ... */ }

или с двумя параметрами (называемыми здесь argc и argv, хотя любые имена могут использоваться, поскольку они являются локальными для функции, в которой они объявлены):

int main(int argc, char* argv[]) { /* ... */ }
  • 0
    -1: данная цитата не поддерживает предыдущий ответ или, кажется, относится к вопросу.
  • 0
    @Potatoswatter вы правы, но на самом деле это сбивает с толку, потому что OP использовал имя функции Main
Показать ещё 2 комментария
7

void в списке параметров эффективно является ключевым словом, не указывая тип чего-либо. Причина его существования носит чисто исторический характер.

Ранняя C не имела прототипов функций или синтаксиса для списков параметров. Определение функции будет выглядеть так:

foo()
int x; // These are the parameters.
float y;
{
    return x + (int) y;
}

"Нет необходимости" для прототипов, потому что компилятор предполагал, что каждый вызов передал точно правильный тип и количество аргументов. Это было ошибкой. Кроме того, тип возврата принимался как int, что является еще более хрупким предположением. Первые прототипы указали только тип возврата.

float foo(); // Still no parameters.

Когда был введен знакомый синтаксис float foo( int x, float y ) была сохранена обратная совместимость с предыдущим стилем. Ключевое слово void использовалось для различения неопределенного (отсутствующего) списка параметров и пустого списка параметров.

В C, float foo() и float foo( void ) означают разные вещи по сей день.

В C++ неопределенные списки параметров не поддерживаются, а float foo( void ) - это обескураженный, но не устаревший синоним для float foo().

Кроме того, C++ позволяет шаблонам определять тип аргумента, но генерировать (void) список параметров по шаблону является ошибкой.

  • 0
    По крайней мере, кто-то упоминал синтаксис pre-ANSI для объявления аргументов функции!
2

В C это

void func() {
}

означает функцию, которая принимает неопределенное количество аргументов. Если вы хотите написать функцию, которая принимает нулевые аргументы, вы делаете это

void func(void) {
}

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

void func(int x, ...) {
}

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

Таким образом, в C и C++ пример 2 означает нулевые аргументы, а пример 3 означает переменное количество аргументов, но C и C++ не согласны с тем, что пример 1 означает, для C это неопределенное количество аргументов, для C++ это нулевые аргументы.

Если вы видите (void) в программе C++, то либо код, который был портирован с C, а никому, он потрудился изменить его или код, который, как ожидается, будет скомпилирован как C и C++ (в например, заголовочный файл).

  • 0
    @Patatoswatter, это то, что я сказал.
  • 0
    @Potatoswatter Хорошо, я обновлю свой ответ, но я думаю, что различие между неопределенным и переменным вряд ли стоит проводить.
Показать ещё 2 комментария
1

Проект n1570;

5.1.2.2.1 Запуск программы:

Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата int и без параметров:

int main(void) { /* ... */ }

или с двумя параметрами (называемыми здесь argc и argv.....)

Из стандарта C ясно, что void используется для функции, не имеющей параметра.

  • 0
    Но он спросил, почему это не параметр?
  • 0
    @Potatoswatter; Потому что стандарт говорит, что он используется без параметров . Не нужно тянуть шерсть.
0

В c++ иногда параметры "имена" могут быть исключены, если они не вызываются из функции. Если вы знаете, что будете использовать его, вы можете добавить имя параметра самостоятельно. Однако вряд ли это имеет смысл для параметра пустоты основного.

0

В старых компиляторах было поручено указывать void в скобках в случае, если main не собирается принимать какие-либо параметры. но в эти дни вам может потребоваться использовать только:

void main() 
  • 0
    -1, ни C, ни C ++ никогда не меняли свое значение () , и ни один язык не позволяет main возвращать void .

Ещё вопросы

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