头文件与源文件相关…
先看一个测试。github地址:https://github.com/shona3n/forward/tree/master/HeaderStaticTest
做个测试a.h文件中有static变量,b.h和c.h皆include “a.h”文件,b.h中和c.h中访问到的变量是否是同一变量,答案不是同一变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 # a.h #ifndef __A_H__ #define __A_H__ #include <stdio.h> static int a = 1 ;#endif # a.c #include "a.h" static int a = 1 ;void setA (int t) { a = t; } int getA () { printf ("A addr: %p\n" , &a); return a; } # b.h #ifndef __B_H__ #define __B_H__ #include <stdio.h> int getB () ;#endif # b.c #include "a.h" #include "b.h" int getB () { printf ("B addr: %p\n" , &a); return a; } # c.h #ifndef __C_H__ #define __C_H__ #include <stdio.h> void setC (int t) ;int getC () ;#endif # c.c #include "a.h" #include "c.h" void setC (int t) { a = t; } int getC () { printf ("C addr: %p\n" , &a); return a; } # main.c #include "b.h" #include "c.h" int main () { printf ("b %d\n" , getB()); printf ("c %d\n" , getC()); setC(5 ); printf ("b %d\n" , getB()); printf ("c %d\n" , getC()); return 0 ; }
编译与运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 # build gcc -o main main.c b.c c. # run ./main # result B addr: 0x5572e08de010 b 1 C addr: 0x5572e08de014 c 1 B addr: 0x5572e08de010 b 1 C addr: 0x5572e08de014 c 5
以上结果可以看到,b.h中的变量a和c.h中的变量a并不是同一个内存。
如果要求b和c访问到的是同一变量,可将static变量放到a.c文件中,将访问接口setA()和getA()放到a.h文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 # a.h #ifndef __A_H__ #define __A_H__ #include <stdio.h> void setA (int t) ;int getA () ;#endif # a.c #include "a.h" static int a = 1 ;void setA (int t) { a = t; } int getA () { printf ("A addr: %p\n" , &a); return a; } # b.h #ifndef __B_H__ #define __B_H__ #include <stdio.h> int getB () ;#endif # b.c #include "a.h" #include "b.h" int getB () { return getA(); } # c.h #ifndef __C_H__ #define __C_H__ #include <stdio.h> void setC (int t) ;int getC () ;#endif # c.c #include "a.h" #include "c.h" void setC (int t) { setA(t); } int getC () { return getA(); } # main.c #include "b.h" #include "c.h" int main () { printf ("b %d\n" , getB()); printf ("c %d\n" , getC()); setC(5 ); printf ("b %d\n" , getB()); printf ("c %d\n" , getC()); return 0 ; }
编译与运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # build gcc -o main main.c b.c c.c a.c # run ./main # result A addr: 0x55ff93f6a010 b 1 A addr: 0x55ff93f6a010 c 1 A addr: 0x55ff93f6a010 b 5 A addr: 0x55ff93f6a010 c 5
以上可以看出,b.h和c.h中的变量都是a.c中的同一变量。
另外,还可以将static int a = 1;修改为extern int a全局声明; 只需在一个c文件里定义int a = 3;即可,在其他文件中访问的都是同一内存变量。
说明 待续…