Я видел некоторый код в C/C++, который выглядит следующим образом:
void Main(void)
А также
int Main(void)
Каковы причины этого: почему это не параметр, а используется в круглых скобках после имени void/int и т.д.?
В 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[]) { /* ... */ }
Main
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)
список параметров по шаблону является ошибкой.
В 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++ (в например, заголовочный файл).
Проект n1570;
Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата
int
и без параметров:int main(void) { /* ... */ }
или с двумя параметрами (называемыми здесь
argc
иargv
.....)
Из стандарта C ясно, что void
используется для функции, не имеющей параметра.
В c++ иногда параметры "имена" могут быть исключены, если они не вызываются из функции. Если вы знаете, что будете использовать его, вы можете добавить имя параметра самостоятельно. Однако вряд ли это имеет смысл для параметра пустоты основного.
В старых компиляторах было поручено указывать void в скобках в случае, если main не собирается принимать какие-либо параметры. но в эти дни вам может потребоваться использовать только:
void main()
()
, и ни один язык не позволяет main
возвращать void
.