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

Может ли функция C main() быть статической?

Можно ли объявить main() функцию static в программе C? Если да, то в чем его смысл?

Возможно ли, что я использую код сборки и вызываю функцию static main() самостоятельно (рассмотрим встроенные программы)?

4b9b3361

Ответ 1

Нет. C spec фактически говорит где-то в нем (я читал спецификацию, верю или нет), что основная функция не может быть статичной.

Причиной этого является то, что static означает "не позволяйте чему-либо вне этого исходного файла использовать этот объект". Преимущество заключается в том, что он защищает от коллизий имен в C, когда вы переходите к ссылке (было бы плохо плохо, если бы у вас было два глобальных символа, названных "is_initialized" в разных файлах... они бы стали безмолвно сливаться, если только вы не сделали их статика). Он также позволяет компилятору выполнять определенные оптимизации, чтобы он не смог иначе. Эти две причины объясняются тем, почему статика - это хорошая вещь.

Поскольку вы не можете получить доступ к статическим функциям извне файла, как бы ОС могла получить доступ к основной функции для запуска вашей программы? Вот почему main не может быть статическим.

Некоторые компиляторы рассматривают "основное" специально и могут молча игнорировать вас, когда вы объявляете его статическим.

Edit: Похоже, я ошибался в том, что спецификация говорит, что main не может быть статичным, но он говорит, что он не может быть встроенным в размещенную среду (если вы должны спросить, что означает "размещенная среда", то вы в одном). Но в OS X и Linux, если вы объявите основную статику, вы получите сообщение об ошибке, потому что компоновщик не может найти определение "main".

Ответ 2

У вас может быть статическая функция main() в исходном файле, и она, вероятно, будет компилироваться, но это не будет функция main(), потому что она будет невидимой для компоновщика при запуске кода (crt0.o на многих (более старых) Unix-системах) вызывает main().

С учетом кода:

static int main(int argc, char **argv)
{
    return(argv + argc);
}

extern int x(int argc, char **argv)
{
    return(main(argc, argv));
}

GCC с помощью -Wall помогает:

 warning: 'main' is normally a non-static function

Да, это можно сделать. Нет, это обычно ошибка - и это не функция main().

Ответ 3

Нет, вы не можете этого сделать. Если вы это сделаете, вы не сможете скомпилировать свою программу. Поскольку статическая функция видна только внутри одного и того же файла, поэтому компоновщик не сможет найти его и сделать его.

Ответ 4

Как говорили другие, нет, не может. И это удваивается, если вы когда-либо намерены перенести свой код на С++, поскольку стандарт С++ указывает, что main() не обязательно должен быть функцией.

Ответ 5

C имеет два значения для "статического"...

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

static для функций имеет то же влияние, что и глобальная переменная как статическая... статическая функция ТОЛЬКО ВИДИМО В ТЕКУЩЕМ ФАЙЛЕ...

Таким образом, основной элемент никогда не может быть статическим, потому что он не сможет служить основной точкой входа для программы.