头文件与源文件相关…

先看一个测试。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() {
// printf("B addr: %p\n", &a);
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;即可,在其他文件中访问的都是同一内存变量。

说明

待续…