我对程序有疑问。我敢打赌,这与我使用静态这一事实有关。这是我的时间
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 ++怎么可能?有任何想法吗?
预先感谢
答案 0 :(得分:5)
在C
中,static
的意思是“模块本地”
请注意,#include
语句只是将头文件粘贴到包含文件中。
因此,您将在不同的模块中创建两个不同的符号(可能具有相同的逻辑名称)。
f.c
cnt
和cnt
是不同的main.c
注意:
static
中的C
和它的C++
具有不同的含义。
并且由于C++
是C
兼容的,所以类外的static
与C
中的含义相同
编辑:
在您的情况下,您不希望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
文件的编译模块中创建该静态变量的单独副本。