文件作用域中的 C 静态变量意味着什么?

Jon*_*ock 7 c static constants

static我有三个文件来演示文件范围中变量的使用。extern变量在 中声明file2.h,在 中初始化file2.c。我正在声明另一个具有相同名称的变量来main.c测试static静态全局范围。但我收到错误消息“main.c|6|error: 'var1' 的静态声明遵循非静态声明。

static有人可以解释一下for 文件范围的用法吗?

如果我不包含file2.h在 中main.c,我不会遇到任何问题。但是,如果我需要使用其他文件的某些函数,main.c但仍希望仅将变量范围保留到该文件,该怎么办?

主程序

#include <stdio.h>
#include "file2.h"


static int var1;

    int main()
    {
        printf("value of staticVar1 = %d\n",var1);
        func1();
        printf("value of staticVar1 after function call= %d\n",var1);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

文件2.h

#ifndef _FILE2_H
#define _FILE2_H
#include <stdio.h>

extern int var1;

int func1(void);

#endif // _FILE2_H
Run Code Online (Sandbox Code Playgroud)

文件2.c

#include <stdio.h>
#include "file2.h"

int var1=3;

int func1(void)
{
    printf("value of staticVar1 inside the function = %d\n",var1);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 6

在文件范围声明的对象具有外部链接或内部链接,它不能同时具有两个链接:

extern int var1;  // declare var1 an int with external linkage
int var1 = 3;     // declare and define var1 with external linkage
static int var1;  // declare and define var1 an int with internal linkage
                  // -> ERROR var1 is redeclared with different linkage
Run Code Online (Sandbox Code Playgroud)

static如果您希望对象的可见性仅限于声明它的源文件,则可以使用说明符。


PSk*_*cik 5

#include从字面上包括其论点的文本。如果你包含 " file2.h",你的顶部main.c将同时包含

\n
    \n
  • extern int var1;\n和

    \n
  • \n
  • static int var1;

    \n
  • \n
\n

编译器将无法判断您是否var1想要

\n
    \n
  • extern(=使其成为对稍后或在某些其他/外部编译单元中使用文件间可见性定义的全局范围变量的尚未解析的引用)
  • \n
\n

或者

\n
    \n
  • static(=将符号放置在此处,但对其他编译单元隐藏它)。
  • \n
\n

编辑:此处描述的静态/外部的更细致的视图:在带有 extern 关键字的文件中使用变量,该变量在基本文件中定义为静态和全局?。需要注意的是,extern可能不会使变量具有“外部链接”\xe2\x80\x94,static int x; extern int x /*x is static because of the previous declaration;它可以复制以前的链接(如果在块作用域中使用extern并且存在中间的遮蔽变量,则可能会遇到未定义的行为。)

\n