Может ли функция main () быть статической? - PullRequest
17 голосов
/ 29 мая 2009

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

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

Ответы [ 5 ]

35 голосов
/ 29 мая 2009

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

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

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

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

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

9 голосов
/ 29 мая 2009

В исходном файле может быть статическая функция с именем 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().

2 голосов
/ 29 мая 2009

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

0 голосов
/ 29 мая 2009

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

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

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

Таким образом, main НИКОГДА не может быть статичным, поскольку он не сможет служить основной точкой входа для программы.

0 голосов
/ 29 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...