user-0 提问: 帮忙解答static关键字的疑问。

回复:
user: user-0
content: 引用 21 楼 hokuhouhi 的回复:[quote=引用 20 楼 mujiok2003 的回复:] [quote=引用 19 楼 hokuhouhi 的回复:] [quote=引用 18 楼 mujiok2003 的回复:] 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量  不同的文件指源文件（*.c)， 不是头文件(*.h) 和这个关系不大，比如程序中有a.c  b.c 1.h a.c程序中有 #include "b.c" #include "1.h" 还不是一样可以使用b.c中static 变量~~ 关键是 写程序的时候lz自己要搞清楚，这个变量其他文件可不可以使用~~[/quote] #include 源码， 太可怕。 [/quote] 当然很少这么做~~我只是说说存在这种情况~~[/quote]  谢谢耐心回答。终于明白了。

user: user-1
content: 引用 20 楼 mujiok2003 的回复:[quote=引用 19 楼 hokuhouhi 的回复:] [quote=引用 18 楼 mujiok2003 的回复:] 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量  不同的文件指源文件（*.c)， 不是头文件(*.h) 和这个关系不大，比如程序中有a.c  b.c 1.h a.c程序中有 #include "b.c" #include "1.h" 还不是一样可以使用b.c中static 变量~~ 关键是 写程序的时候lz自己要搞清楚，这个变量其他文件可不可以使用~~[/quote] #include 源码， 太可怕。 [/quote] 当然很少这么做~~我只是说说存在这种情况~~

user: user-2
content: 引用 19 楼 hokuhouhi 的回复:[quote=引用 18 楼 mujiok2003 的回复:] 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量  不同的文件指源文件（*.c)， 不是头文件(*.h) 和这个关系不大，比如程序中有a.c  b.c 1.h a.c程序中有 #include "b.c" #include "1.h" 还不是一样可以使用b.c中static 变量~~ 关键是 写程序的时候lz自己要搞清楚，这个变量其他文件可不可以使用~~[/quote] #include 源码， 太可怕。

user: user-1
content: 引用 18 楼 mujiok2003 的回复:引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量  不同的文件指源文件（*.c)， 不是头文件(*.h) 和这个关系不大，比如程序中有a.c  b.c 1.h a.c程序中有 #include "b.c" #include "1.h" 还不是一样可以使用b.c中static 变量~~ 关键是 写程序的时候lz自己要搞清楚，这个变量其他文件可不可以使用~~

user: user-2
content: 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量  不同的文件指源文件（*.c)， 不是头文件(*.h)

user: user-1
content: 引用 16 楼 zhanglingkang 的回复:[quote=引用 3 楼 user-9 的回复:] .h文件是被包含、被引用的  static可以在不同的文件中定义相同的变量，这个不同的文件是指.c文件中定义 如果放在.c文件里，包含进来，也是一样的效果，[/quote]  你还不明白吗，你既然包含进来了，那就算是一个文件了~~ 因为程序的编译过程，有个预处理，预处理会把你#include的所有东西放到一个文件中， 然后在做编译~~~

user: user-0
content: 引用 3 楼 user-9 的回复:.h文件是被包含、被引用的  static可以在不同的文件中定义相同的变量，这个不同的文件是指.c文件中定义 如果放在.c文件里，包含进来，也是一样的效果，

user: user-1
content: 因为你的程序有 #include "first.h" 然后预编译的时候，会把里面的内容加载进来~~~ 你自己试试 gcc -E demo4.c -o demo4.i 看看demo4.i里面有什么

user: user-3
content: static让变量具有内部链接属性，意思就是，不同的编译单元定义该变量时，这些变量是不同的变量。 举个例子： 你这个例子中，如果还有一个编译单元是demo2.c，也包含了 first.h， 还有个函数定义如下， void set_static_b(){ b=6; printf("%d\n",b); } 那么，在demo4.c的main里，调用set_static_b() ,然后再输出当前的b ， printf("%d\n",b); 你将得到的结果是： 6 3 即demo2.c中set_static_b() 并没有修改demo4.c中的b。

user: user-0
content: 引用 4 楼 u013171165 的回复:你需要注意的是在头文件里定义的static a，在某个cpp文件里修改了他不影响其他cpp文件里a的值。 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量。我定义了如下两个文件。你这么说，就要定义相同的啊，而不是定义static int b=3; static char *a = "abd"; 例子确实不太好。主要疑问是为什么能访问到b。我定义相同的，会有重复定义错误。

user: user-4
content: 引用 1 楼 yangyunzhao 的回复:哪里看出来static没有起作用啊？？ 没有把b的作用域限制在本文件内啊。在demo4.c中被访问到了

user: user-0
content: 引用 5 楼 k91191 的回复:你是不是想改变b的值，但是"abd"是字符串啊！，b在里面只是个字符而已，而不是变量了! 恩，我主要的问题是为什么访问到first.h中的b了。b是static类型的。按书上说，作用域应该在本文件内才对。

user: user-0
content: 引用 6 楼 zxh707wk 的回复:明白了，lz你把static的含义理解错了 不能访问到b就是我想要的效果。但是现在声明为static的。却访问到了。这是让我不解的地方。

user: user-0
content: 引用 7 楼 u013491662 的回复:对于全局变量来说，加static修饰就是把此全局变量的作用域限制在此源文件内 楼主第一个文件里 static int b=3; 相当于把变量b限制在第一个文件里，其他源文件不能使用这个变量 改法： 第一个文件里的变量b去掉static修饰  int b=3;  第二个文件里添加代码：  extern int b;  是这样的，我的代码可能给的确实不恰当。按我的理解，变量b在first.h中是static的。所以b在demo4.c应该是不可见的。那么demo4.c为什么能访问到b.而且我在demo4.c中再次定义b。会报重复定义错误。static不是把变量的作用域限定在本文件内的嘛。怎么没有起到期望的效果。

user: user-5
content: 对于全局变量来说，加static修饰就是把此全局变量的作用域限制在此源文件内 楼主第一个文件里 static int b=3; 相当于把变量b限制在第一个文件里，其他源文件不能使用这个变量 改法： 第一个文件里的变量b去掉static修饰  int b=3;  第二个文件里添加代码：  extern int b;

user: user-6
content: 明白了，lz你把static的含义理解错了

user: user-7
content: 你是不是想改变b的值，但是"abd"是字符串啊！，b在里面只是个字符而已，而不是变量了!

user: user-8
content: 你需要注意的是在头文件里定义的static a，在某个cpp文件里修改了他不影响其他cpp文件里a的值。 引用书中，网上对static作用描述中，都有这么一个，可以在不同的文件中定义相同的变量。我定义了如下两个文件。你这么说，就要定义相同的啊，而不是定义static int b=3; static char *a = "abd";

user: user-9
content: .h文件是被包含、被引用的  static可以在不同的文件中定义相同的变量，这个不同的文件是指.c文件中定义

user: user-8
content: 这不是有结果么？你这样看不出来什么的。