我正在开发一个C项目,其中部分代码由不同的应用程序生成。单独的文件将包含以下内容:
如上所述,第二个文件中的信息由不同的程序生成,但它使用主文件中的类型声明。同样,主程序使用第二个文件中定义的变量和函数。
我尝试使用“include”和“extern”语句,但在此方面并不是很成功。由于这两个文件是相互获取信息的,因此将它们分解为三个文件会更有用吗?
1)类型定义
2)变量声明(使用文件1中定义的类型)和相关函数
3)Main()和其他使用上述两个文件的函数
如果这是要走的路,它将如何运作?它会使用include还是extern,我将如何使用这些子句?
非常感谢您提供的任何帮助。谢谢!
答案 0 :(得分:1)
您建议的布局没有任何问题。或许对 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;
}
M.C ---------
#include <stdio.h> // for stdout
#include "t.h"
#include "v.h"
int main () {
fprintf( stdout, "%d", a + b - f(1, 2) );
return 0;
}
t.h -----------
typedef int mytype;
v.h -----------
#include "t.h"
extern mytype a, b;
int f( int, int );
v.h和t.h可以组合(这是一个风格问题和项目要求)。请注意,v.h中的f声明在其前面有一个隐含的extern。
答案 1 :(得分:0)
如评论中所述,您几乎肯定需要一个标题 - 称之为header.h
- 它将包含在包含主程序的文件中(文件1,称之为main.c
)和在生成的文件中(文件2,将其称为generated.c
)。
头文件将包含类型定义和共享函数声明(并且会消除思想,任何全局变量的声明)。它将是自包含的和幂等的(请参阅Stack Overflow问题What are extern
variables in C?,Should I use #include
in headers?,How to link multiple implementation files in C?和Linking against a static library等。
main.c
和generated.c
都包含header.h
。为确保header.h
是自包含的,一个(或两个)文件将#include "header.h"
作为第一个标题。
答案 2 :(得分:0)
终于修好了。如果其他人有同样的问题,我遵循Alexsh的步骤,但我也必须在我的.h文件中include guards以防止重新定义(否则它将无法编译)。非常感谢Alexsh和Jonathan的帮助!