静态变量有什么问题吗?

时间:2019-04-27 18:13:14

标签: c static

我对程序有疑问。我敢打赌,这与我使用静态这一事实有关。这是我的时间

static int  cnt;

void f();

我的main.c

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

void main()
{
        cnt=0;
        printf("before f : cnt=%d\n",cnt);
        f();
        printf("after f : cnt=%d\n",cnt);
 }

最后是我的朋友

#include "t.h"


void f()
{
        cnt++;
}

printf两次打印cnt = 0。我做cnt ++怎么可能?有任何想法吗?

预先感谢

3 个答案:

答案 0 :(得分:5)

C中,static的意思是“模块本地”

请注意,#include语句只是将头文件粘贴到包含文件中。
因此,您将在不同的模块中创建两个不同的符号(可能具有相同的逻辑名称)。
f.c cntcnt是不同的main.c

注意: static中的C和它的C++具有不同的含义。
并且由于C++C兼容的,所以类外的staticC中的含义相同

编辑:
在您的情况下,您不希望static想要一个变量,但是我想您在Linker告诉您有关“歧义符号”时遇到问题。

我建议在头文件中声明extern,并在模块中声明实际变量。

t.h 
  extern int cnt; // declaration of the variable cnt

main.cpp
  #include 
  #include "t.h"
  int cnt = 0; // actual definition of cnt
  void main()
  {
     cnt=0;
     printf("before f : cnt=%d\n",cnt);
     f();
     printf("after f : cnt=%d\n",cnt);
  }

t.cpp
    #include "t.h"

    void f()
    {
        cnt++;
    }

答案 1 :(得分:0)

不要在头文件中定义cnt。而是在f.c中定义它:

#include "t.h"

int cnt = 0;
void f(){
    cnt++;
}

然后在main.c的{​​{1}}函数开始之前添加以下内容:

main

答案 2 :(得分:0)

不应在头文件中定义数据。

在您的示例中,您将在每个包含此.h文件的编译模块中创建该静态变量的单独副本。