C - 在单独的文件中包含变量(struct)声明和函数

时间:2013-08-02 22:03:10

标签: c file include

我正在开发一个C项目,其中部分代码由不同的应用程序生成。单独的文件将包含以下内容:

  • 类型定义,main()和其他函数
  • 变量声明(其类型定义在上面的文件中)和用于处理这些变量的函数

如上所述,第二个文件中的信息由不同的程序生成,但它使用主文件中的类型声明。同样,主程序使用第二个文件中定义的变量和函数。

我尝试使用“include”和“extern”语句,但在此方面并不是很成功。由于这两个文件是相互获取信息的,因此将它们分解为三个文件会更有用吗?

1)类型定义

2)变量声明(使用文件1中定义的类型)和相关函数

3)Main()和其他使用上述两个文件的函数

如果这是要走的路,它将如何运作?它会使用include还是extern,我将如何使用这些子句?

非常感谢您提供的任何帮助。谢谢!

3 个答案:

答案 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.cgenerated.c都包含header.h。为确保header.h是自包含的,一个(或两个)文件将#include "header.h"作为第一个标题。

答案 2 :(得分:0)

终于修好了。如果其他人有同样的问题,我遵循Alexsh的步骤,但我也必须在我的.h文件中include guards以防止重新定义(否则它将无法编译)。非常感谢Alexsh和Jonathan的帮助!