为什么此代码中的`bar`没有静态存储持续时间?

nal*_*zok -7 c static scope declaration

代码优先:

#include <stdio.h>

void foo()
{
        static int bar;
}

int main()
{
        bar++;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器(Clang)抱怨:

static.c:10:2: error: use of undeclared identifier 'bar'
Run Code Online (Sandbox Code Playgroud)

该语句static int bar;中是否应该foo()给出bar静态存储持续时间,这使得它在main函数之前声明并初始化?

Sou*_*osh 5

您将变量的范围存储持续时间混淆.

C11标准中所述,章节§6.2.1,标识符范围,

  • 对于文件范围

[...]如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件范围,该范围终止于转换单元的末尾.[...]

以及功能(或)范围

[...]如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾.[...]

在您的情况下,bar具有文件范围foo().所以这是不可见main().

OTOH,用于存储持续时间的部分,

声明标识符的对象,如果没有存储类说明符 _Thread_local,并且具有外部或内部链接或使用存储类说明符static,则具有静态存储持续时间.它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次.

因此,总结一下,bar具有静态存储持续时间,但范围仅限于该foo()功能.所以,它是

main()函数之前声明和初始化

(在main()开始之前,确切地说)但不可见且可访问main().