为啥要在 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;
/* ... */
这是一个错误还是有一些理由在main
static
中声明一个变量?据我了解static
防止链接并保持调用之间的值。因为这里它在一个函数内部,它只执行后者,但main
只被调用一次,所以我不明白这一点。这是否会修改某些编译行为(例如,防止它被优化而不再存在)?
【问题讨论】:
IIRCstatic
变量被放置在不同的部分。另请参阅:***.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 中声明一个静态变量?的主要内容,如果未能解决你的问题,请参考以下文章