为啥要在 main 中声明一个静态变量?

Posted

技术标签:

【中文标题】为啥要在 main 中声明一个静态变量?【英文标题】:Why declare a static variable in main?为什么要在 main 中声明一个静态变量? 【发布时间】:2016-11-22 14:16:23 【问题描述】:

阅读别人的代码,我看到了一些语法类似的东西:

int main(void) 
    static int attr[] = FOO, BAR, BAZ, 0;
    /* ... */

这是一个错误还是有一些理由在mainstatic 中声明一个变量?据我了解static 防止链接并保持调用之间的值。因为这里它在一个函数内部,它只执行后者,但main 只被调用一次,所以我不明白这一点。这是否会修改某些编译行为(例如,防止它被优化而不再存在)?

【问题讨论】:

IIRC static 变量被放置在不同的部分。另请参阅:***.com/questions/93039/… 虽然这可能是不好的做法,但是,正式地,谁阻止您(或其他人)递归调用 main(稍后在代码中)? static 表示变量未分配在栈中(存储在数据段或BSS段中)。 尝试分配没有静态的大数组:int arr[100000000];,看看会发生什么。 @user975989:请说明标准中的部分! IIRC 它与 C 完全相反(这并不意味着它是推荐的做法)。 C++ 不允许递归调用main,但那是一种不同的语言。 【参考方案1】:

除非你在做一些非常不标准的事情,比如直接调用main,否则在main 中声明局部变量static 没有什么意义。

但是,如果您在 main 中使用了一些对于堆栈来说太大的大型结构,那么它很有用。然后,将变量声明为static 意味着它位于数据段中。

static 也意味着,如果未初始化,变量将被初始化为全 0,就像全局变量一样。

【讨论】:

【参考方案2】:

static 还告诉编译器将数据存储在通常存储全局变量的内存的 .data 部分中。您可以将其用于可能溢出堆栈的大型数组。

【讨论】:

.bss 仅用于默认初始化数据(仅零)。非零全局变量转到.data @nebuch:你说的是这一段的哪一部分? 它绝对不会用到 BSS,因为它有一个显式的初始化器(除非它全为零)。你最好更正答案,否则它是正确的。 @blatinox: ``静态局部常量必须在声明时初始化,但是,因为它们没有单独的声明,因此通常不在 BSS 部分中'' @nebuch:我们在这里不讨论常量。同一个链接说:“因此,BSS 段通常包括在文件范围(即,在任何函数之外)声明的所有未初始化对象(变量和常量)以及未初始化的静态局部变量”。

以上是关于为啥要在 main 中声明一个静态变量?的主要内容,如果未能解决你的问题,请参考以下文章

静态成员

如何在 Main 方法中声明静态变量?

为啥/何时应该使用静态声明变量?

java:在java中为啥静态变量没有this引用?

关于java静态变量取值的问题。

为啥 main() 不能在 C 中声明为静态的?