my1.c
extern 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。如何让链接器为这种不一致性引发错误?
e
float
int
5lwkijsr1#
我们使用头文件而不是链接器来减轻这种风险。在多个翻译单元中引用的任何内容都应该在一个头文件中声明:MyGlobal.h:
extern float e;
任何使用它的文件都应该包含头文件:main.c:
#include "MyGlobal.h" … printf("e is %f.\n", e);
应该只有一个文件定义它,并包括头文件:MyGlobal.c:
#include "MyGlobal.h" float e = 0;
通过使用头文件,所有翻译单元中的声明都是相同的。因为定义标识符的源文件也包括头文件,编译器会报告任何不一致。头文件之外的任何外部声明(不是定义)都是可疑的,应该避免。
mm5n2pyu2#
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); }
2条答案
按热度按时间5lwkijsr1#
我们使用头文件而不是链接器来减轻这种风险。在多个翻译单元中引用的任何内容都应该在一个头文件中声明:
MyGlobal.h:
任何使用它的文件都应该包含头文件:
main.c:
应该只有一个文件定义它,并包括头文件:
MyGlobal.c:
通过使用头文件,所有翻译单元中的声明都是相同的。因为定义标识符的源文件也包括头文件,编译器会报告任何不一致。
头文件之外的任何外部声明(不是定义)都是可疑的,应该避免。
mm5n2pyu2#
1.c
2.c