如何让编译器捕捉两个C源文件中全局变量类型不一致的问题

m1m5dgzv  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(90)

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在两个源文件中被错误地声明为floatint
如何让链接器为这种不一致性引发错误?

5lwkijsr

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;

通过使用头文件,所有翻译单元中的声明都是相同的。因为定义标识符的源文件也包括头文件,编译器会报告任何不一致。
头文件之外的任何外部声明(不是定义)都是可疑的,应该避免。

mm5n2pyu

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

相关问题