如何让编译器在C的两个源文件中捕获不一致类型的全局变量
How to let compiler catch inconsistent type of global variables in two source files of C
my1.c
float e;
void f1(){ e=3.0;}
my2.c
#include <stdio.h>
int e=0;
void f1();
void main(){
printf("%d in main \n", e);
f1();
printf("%d in main \n", e);
}
此处全局变量e
在两个源文件中被错误声明为float
和int
如何让链接器针对这种不一致引发错误?
我们使用头文件而不是链接器来降低这种风险。多个翻译单元中引用的任何内容都应在一个头文件中声明:
MyGlobal.h:
extern float e;
任何使用它的文件都应该包含头文件:
main.c:
#include "MyGlobal.h"
…
printf("e is %f.\n", e);
一个文件应该定义它,并包含头文件:
MyGlobal.c:
#include "MyGlobal.h"
float e = 0;
通过使用头文件,声明在所有翻译单元中都是相同的。因为定义标识符的源文件也包含头文件,所以编译器会报告任何不一致。
头文件之外的任何外部声明(不是定义)都是可疑的,应该避免。
1.c
static float e;
void f1(){ e=3.0;}
2.c
#include <stdio.h>
static int e=0;
void f1();
void main()
{
printf("%d in main \n", e);
f1();
printf("%d in main \n", e);
}
my1.c
float e;
void f1(){ e=3.0;}
my2.c
#include <stdio.h>
int e=0;
void f1();
void main(){
printf("%d in main \n", e);
f1();
printf("%d in main \n", e);
}
此处全局变量e
在两个源文件中被错误声明为float
和int
如何让链接器针对这种不一致引发错误?
我们使用头文件而不是链接器来降低这种风险。多个翻译单元中引用的任何内容都应在一个头文件中声明:
MyGlobal.h:
extern float e;
任何使用它的文件都应该包含头文件:
main.c:
#include "MyGlobal.h"
…
printf("e is %f.\n", e);
一个文件应该定义它,并包含头文件:
MyGlobal.c:
#include "MyGlobal.h"
float e = 0;
通过使用头文件,声明在所有翻译单元中都是相同的。因为定义标识符的源文件也包含头文件,所以编译器会报告任何不一致。
头文件之外的任何外部声明(不是定义)都是可疑的,应该避免。
1.c
static float e;
void f1(){ e=3.0;}
2.c
#include <stdio.h>
static int e=0;
void f1();
void main()
{
printf("%d in main \n", e);
f1();
printf("%d in main \n", e);
}