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

** переменная - двойное разыменование. Если переменная является адресом адреса, полученное выражение будет lvalue по адресу, хранящемуся в переменной *.

Это может означать разные вещи, если является частью объявления:

переменная типа ** будет означать, с другой стороны, указатель на указатель, то есть переменную, которая может содержать адрес другого переменная, которая также является указателем, но на этот раз на переменную типа 'type'

17
задан unwind 29 May 2009 в 10:31
поделиться

5 ответов

No. The C spec actually says somewhere in it (I read the spec, believe it or not) that the main function cannot be static.

The reason for this is that static means "don't let anything outside this source file use this object". The benefit is that it protects against name collisions in C when you go to link (it would be bad bad bad if you had two globals both named "is_initialized" in different files... they'd get silently merged, unless you made them static). It also allows the compiler to perform certain optimizations that it wouldn't be able to otherwise. These two reasons are why static is a nice thing to have.

Since you can't access static functions from outside the file, how would the OS be able to access the main function to start your program? That's why main can't be static.

Some compilers treat "main" specially and might silently ignore you when you declare it static.

Edit: Looks like I was wrong about that the spec says main can't be static, but it does say it can't be inline in a hosted environment (if you have to ask what "hosted environment" means, then you're in one). But on OS X and Linux, if you declare main static, then you'll get a link error because the linker can't find the definition of "main".

35
ответ дан 30 November 2019 в 10:59
поделиться

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

9
ответ дан 30 November 2019 в 10:59
поделиться

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

2
ответ дан 30 November 2019 в 10:59
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 10:59
поделиться

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

0
ответ дан 30 November 2019 в 10:59
поделиться
Другие вопросы по тегам:

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