【问题标题】:Can we really restrict the scope of a global variable using Static?我们真的可以使用静态限制全局变量的范围吗?
【发布时间】:2011-10-25 16:49:45
【问题描述】:

我在某处读到,我们只能通过以下方式将全局变量的范围限制为文件 在变量名之前使用 static 关键字。但是,当我实际尝试时,结果是错误的:

//1st file - file1.c                   //2nd file - file2.h
#include<file2.h>                      static int a;
main()                                
{
    fun();                                 
}                                                                                 

fun()
{
    printf("%d",a);
}   

O/P 为 0

现在我们确实有一个在 file2.h 中声明的全局变量 a,其范围仅限于该文件。
因为,我们已经将它声明为静态的,但我们仍然可以在 file1.c 中访问这个变量。怎么样?

【问题讨论】:

  • 你在质疑自己的答案吗?? link

标签: c static global-variables


【解决方案1】:

restrict the scope of global variable to a file语句中,file表示编译单元,即.c文件。您的 file2.h 包含在 file1.c 中,它们构成一个编译单元 file1

将变量移动到第二个编译单元,例如file2.c,您会发现即使使用 extern 声明也无法访问它。

【讨论】:

  • 这听起来不错!!但仍然在 file2.c 中我必须包含 file2.h??
  • 将#include 视为复制粘贴文件内容。如果你在file1.cfile2.c 中都包含file.h,它们都将声明a,但它们将是两个不同的变量:改变一个不会改变另一个。
  • @Amit Singh Tomar:在 file2.c 中不包含 file2.h 最终会创建与您现在相同的场景吗?
【解决方案2】:

范围不限于文件,而是翻译单元。由于您将file2.h 包含在file1.c 中,这就是一个TU ——您不妨将file2.h 的内容粘贴到源文件中。

【讨论】:

    【解决方案3】:

    您正在包含文件file2.h,在该文件中,您将变量声明为具有 main 的 c 文件中的静态变量,这与在该 c 文件中编写声明一样好。

    当您包含一个声明静态变量的头文件时,将为包含该头文件的每个翻译单元(c 文件 + 包含的头文件)创建该变量的副本。

    永远不要在头文件中声明静态变量。

    要测试场景,你应该这样做:

    //file1.c 
    
    static int i = 10;
    
    //file2.c
    
    extern int i;
    
    int main()
    {
        int a = i;
        return 0;   
    }
    

    【讨论】:

      【解决方案4】:

      作用域是在 C 的预处理器运行之后定义的。即:在所有#include-statements 都被评估和内联之后。

      【讨论】:

        猜你喜欢
        • 2016-02-26
        • 2015-09-20
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多