如何让编译器在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在两个源文件中被错误声明为floatint

如何让链接器针对这种不一致引发错误?

我们使用头文件而不是链接器来降低这种风险。多个翻译单元中引用的任何内容都应在一个头文件中声明:

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);
}