静态变量文件范围

时间:2015-10-09 09:20:01

标签: c

我有三个文件来演示在文件范围中使用静态变量。变量在file2.h中声明为extern,在file2.c中初始化。我在main.c中声明另一个具有相同名称的变量作为静态来测试静态全局范围。但是我收到错误消息" main.c | 6 |错误:静态声明' var1'遵循非静态声明|。 有人可以解释一下静态文件范围的用法吗? 如果我在main.c中不包含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;
    }

file2.h

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

extern int var1;

int func1(void);

#endif // _FILE2_H

file2.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);
}

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

  • extern int var1;

  • static int var1;

编译器无法判断您是否希望var1

  • extern(=使其成为对某些其他编译单元中定义的全局范围变量的尚未解析的引用)

  • static(=将符号放在此处,但将其隐藏在其他编译单元中)。

答案 2 :(得分:0)

将外部声明放在标题上,并且只对一个源文件进行定义即可。删除

static int var1;

你应该没事。您正在使用两个正交属性限定变量:staticextern。前者是说它只能在内部可见,而后者则说它将被外部引用。这就是您看到错误的原因。

  

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

这意味着static将具有内部链接。没有其他TU能够在您定义的符号之外查看此符号。

  

如果我需要在main.c中使用其他文件的某些函数但仍想将变量范围保留在此文件中呢?

从标题中删除extern声明,并将变量仅保存在main.c中。

答案 3 :(得分:0)

如果在main.c中声明var1 static,则意味着此变量只能在此文件的编译单元中使用。 它还允许声明

Realm.framework

在每个.c文件中没有冲突,因为该变量未导出或对其他编译单元/ .c文件可见。

static int var1

与静态声明有些相反。它说var1变量不是在这里声明的,而是在其他地方声明的。 例如,如果您有一个声明

的example.c文件,则可以使用extern
extern int var1 

以及其他几个.c文件,您还希望在example.c中设置和读取该确切变量的值。 在那些.c文件中,您将声明变量

int var1

告诉编译器变量var1存在但未在此处声明。 如果你忘记在example.c中真正声明变量但在其他.c文件中使用extern,你应该得到一个未定义的引用错误,我认为,因为在这种情况下的变量存在在链接时被检查