您建议的布局没有任何问题。也许对extern和#include所做的一些澄清会有所帮助。1) #include是一个预处理器指令,它本质上是说:`获取命名文件并假装它被粘贴在这个指令的位置'
2) extern是一个 C 保留字。不涉及太多技术细节,但其含义是:`此语句中命名的变量定义在不同的位置'。编译器只为变量保留一次空间,因此如果函数需要访问相关变量,则在编译器看到定义之前需要一些信息。extern声明为函数提供了足够的信息以使用该变量,并且链接器确保在稍后阶段使用正确的变量。
因此,在您的方案中,具有类型定义的文件将在引用这些类型的每个文件中#include 。如果您想将所有变量定义收集在一个文件中,该文件将与项目的其他部分分开编译,则任何使用这些变量并将单独编译的文件都需要为在别处定义的每个变量提供一个extern声明。请注意,如果您只是简单地包含带有变量定义的文件,编译器将看到该定义两次(首先在包含定义的文件中,然后在包含它的文件中)并假设您尝试定义每个变量两次并发出错误。
最后,这是一个简单的场景(它没有真正的意义并且风格很糟糕):
交流---------
#include "t.h"
mytype a;
mytype b;
int f( int x, int y ) {
return (x + y)*a - b;
}
麦克---------
#include <stdio.h> // for stdout
#include "t.h"
#include "v.h"
int main () {
fprintf( stdout, "%d", a + b - f(1, 2) );
return 0;
}
th-----------
typedef int mytype;
vh-----------
#include "t.h"
extern mytype a, b;
int f( int, int );
vh 和 th 可以组合(这是风格和项目要求的问题)。注意 vh 中的 f 声明前面有一个隐含的 extern。