加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么在这个C程序中将全局变量定义为静态?

发布时间:2020-12-16 09:58:32 所属栏目:百科 来源:网络整理
导读:参见英文答案 What does “static” mean in C?????????????????????????????????????18个 ???????????? When to use static keyword before global variables?????????????????????????????????????8个 我正在尝试使用 this教程学习C语言.有一个例子,作者试
参见英文答案 > What does “static” mean in C?????????????????????????????????????18个
>???????????? When to use static keyword before global variables?????????????????????????????????????8个
我正在尝试使用 this教程学习C语言.有一个例子,作者试图了解静态存储类是什么.

这就是这个例子:

#include <stdio.h>

/* function declaration */
void func(void);

static int count = 5; /* global variable */

main()
{
   while(count--)
   {
      func();
   }
   return 0;
}
/* function definition */
void func( void )
{
   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %dn",i,count);
}

我的问题是:为什么他/她被定义为静态?换句话说,上述程序和以下程序有什么区别?

#include <stdio.h>

/* function declaration */
void func(void);

int count = 5; /* global variable */

main()
{
   while(count--)
   {
      func();
   }
   return 0;
}
/* function definition */
void func( void )
{
   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %dn",count);
}

我的意思是,当我们必须使用第一个程序时,何时必须使用第二个程序?

解决方法

将您的计数定义为全局变量或静态变量在您的特定示例中无关紧要(每个程序只有一个源文件,即一个 translation unit).但它确实对i(没有static关键字,将成为自动局部变量)很重要,因为它是在函数内声明的.但是,对于由多个翻译单元组成的任何程序(链接在一起以生成可执行文件),它将非常重要.

如果在两个不同的转换单元中定义一个count全局变量(即在foo1.c和foo2.c中),链接器会抱怨多个定义(当你使用gcc foo1从foo1.o& foo2.o构建你的foo可执行文件时. o Linux系统上的foo2.o -o foo);如果你定义了一个静态int计数; foo1.c和foo2.c中的变量都可以(但是你有两个同义变量,每个都有自己的地址,并且每个都隐式初始化为0;恕我直言,这通常很差,因为它使源代码更少可读的).

作为例外,您可以声明而不是在两个不同的转换单元中显式初始化它是同名的全局变量.该名称引用相同且唯一的全局(初始化为0).

所以有

// in file foo1.c
int globalcount; // a global variable *declaration*

// in file foo2.c
int globalcount; // a global variable *declaration*

和拥有一样

// in file foo1.c
int globalcount = 0; // a global variable *definition* with initialization

// in file foo2.c
extern int globalcount;  // an external variable declaration

实际上,外部声明通常应该在一些头文件foo.h中,它由foo1.c和amp;来获得#include-d. foo2.c.

因此,(主程序的)静态变量在plugins中也是不可见的.阅读更多关于visibility attribute(在Linux上)以使变量仅由单个插件或共享库可见(但不在其外部).

阅读linkers上的wikipage& dynamic linkers然后是莱文的书linkers and loaders

实际上,我建议为非局部变量(全局变量和静态变量)使用唯一名称,以提高可读性和便利性(因为它很容易使用grep);但有时你可能希望在不同的编译单元中有一些具有相同名称的静态变量.如果你这样做,我建议评论为什么,并有一些一致的命名约定.

查找用C编码的某些free software中的示例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读