0

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

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

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

我曾尝试使用“include”和“extern”语句,但并没有很成功。由于这两个文件是相互获取信息的,那么将它们分成三个文件是否更有用,如下所示?

1) 类型定义

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

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

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

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

4

3 回答 3

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;

}

麦克---------

#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。

于 2013-08-02T22:42:15.667 回答
0

终于修好了。如果其他人有同样的问题,我会按照 Alexsh 的步骤进行操作,但我还必须在我的 .h 文件中包含保护以防止重新定义(否则它不会编译)。非常感谢 Alexsh 和 Jonathan 的帮助!

于 2013-08-04T06:58:55.167 回答
0

正如评论中所述,您几乎肯定需要一个标题 - 调用它header.h- 它将包含在包含主程序的文件(文件 1,调用它main.c)和生成的文件(文件 2,调用它generated.c)中。

头文件将包含类型定义和共享函数声明(以及任何全局变量的声明)。它将是自包含的和幂等的(除其他外,请参阅 Stack Overflow 问题What is externvariables in C?我应该#include在标头中使用吗?如何在 C 中链接多个实现文件?以及Linking against a static library)。

两者都main.cgenerated.c包括header.h. 为了确保它header.h是独立的,一个(或两个)文件将#include "header.h"作为第一个标题。

于 2013-08-02T22:22:51.953 回答