C-在单独的文件中包含变量(结构)声明和函数
我正在从事一个C项目,其中部分代码由不同的应用程序生成。单独的文件将包含以下内容:C-在单独的文件中包含变量(结构)声明和函数,c,file,include,C,File,Include,我正在从事一个C项目,其中部分代码由不同的应用程序生成。单独的文件将包含以下内容: 类型定义、main()和其他函数 变量声明(其类型定义在上面的文件中)和使用这些变量的函数 如上所述,第二个文件中的信息由不同的程序生成,但它使用主文件中的类型声明。同样,主程序使用第二个文件中定义的变量和函数 我尝试过使用“include”和“extern”语句,但都不是很成功。由于这两个文件互相获取信息,将它们分成以下三个文件是否更有用 1) 类型定义 2) 变量声明(使用文件1中定义的类型)和相关函数
- 类型定义、main()和其他函数
- 变量声明(其类型定义在上面的文件中)和使用这些变量的函数
非常感谢您提供的任何帮助。谢谢大家! 如注释中所述,您几乎肯定需要一个标题,称之为
header.h
,它将包含在包含主程序的文件(文件1,称之为main.c
)和生成的文件(文件2,称之为generated.c
)中
头文件将包含类型定义和共享函数声明(以及任何全局变量的声明)。它将是自包含且幂等的(除其他外,请参见堆栈溢出问题、、和)
main.c
和generated.c
都将包含header.h
。为确保header.h
是自包含的,其中一个(或两个)文件将#包括“header.h”
作为第一个头。您建议的布局没有问题。也许对外部和#include的作用进行一些澄清会有所帮助。
1) #include是一个预处理器指令,本质上说:`获取命名文件,并假装它是粘贴在该指令的位置上的'
2) extern是一个C保留字。我不想涉及太多的技术细节,但它的含义是:`在这个语句中命名的变量是在另一个地方定义的'。编译器只为变量保留一次空间,因此,如果函数需要访问相关变量,则在编译器查看定义之前需要一些信息。extern声明有足够的信息供函数使用变量,链接器确保在稍后阶段使用正确的变量
因此,在您的场景中,具有类型定义的文件将包含在引用这些类型的每个文件中。如果要将所有变量定义收集到一个文件中(该文件将与项目的其他部分分开编译),则需要为在别处定义的每个变量提供一个extern声明。请注意,如果只是将th文件包含在变量定义中,编译器将看到该定义两次(首先在包含该定义的文件中,然后在包含该定义的文件中),并假设您尝试定义每个变量两次,并将发出错误
最后,这里是一个简单的场景(它没有真正意义,而且风格不好):
a、 c---------
m、 c---------
v、 h-----------
v、 h和t.h可以结合使用(这是风格和项目要求的问题)。注意,v.h中的f声明前面有一个隐含的extern。最终修复。如果其他人也有同样的问题,我会遵循Alexsh的步骤,但我也必须在我的.h文件中添加,以防止重新定义(否则它将无法编译)。非常感谢阿列克什和乔纳森的帮助 欢迎来到堆栈溢出。请尽快阅读这一页。听起来好像您需要一个头文件来包含类型定义,这些定义将由包含
main()
etc的代码以及生成的代码(通过某种或多或少的迂回方式)包含。您对生成的内容有多大的控制权?生成的代码是否包含您可以控制的任何头文件?也许这两个文件的示例和文件类型可以帮助您获得所需的解决方案。嗨,Jonathan,谢谢您的回复。我可以控制所有代码,包括头和生成文件中的其余代码。我将从每个文件中获取一些相关代码并发布。谢谢你的快速回答!亚历克斯,这真是个好消息。正如你提到的,我已经分离了我的代码,似乎有问题。当我编译这两个.c文件时,它告诉我在m.c中有未声明的变量-基本上,它没有看到我在a.c中声明的变量(即使我使用“gcc a.c m.c”编译它们)。我可能做错了什么?我在上面的m.c中没有看到任何对a.c的引用,所以m.c应该还是能够以某种方式看到a.c的内容吗?非常感谢!我刚刚尝试过,它编译得很好。你可以发布一条gcc生成的错误消息吗?也可以尝试分别编译它们,如gcc-c a.c
和gcc-c m.c
然后看看会发生什么。另外,你确定v.h和t.h在同一个目录中吗?m.c需要的变量信息来自这些头文件。不过我改变了一个输入错误:printf应该是fprintfI。我之前留下评论时没有看到这一点。很高兴一切都解决了。
#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;
}
typedef int mytype;
#include "t.h"
extern mytype a, b;
int f( int, int );