Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-在单独的文件中包含变量(结构)声明和函数_C_File_Include - Fatal编程技术网

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

C-在单独的文件中包含变量(结构)声明和函数,c,file,include,C,File,Include,我正在从事一个C项目,其中部分代码由不同的应用程序生成。单独的文件将包含以下内容: 类型定义、main()和其他函数 变量声明(其类型定义在上面的文件中)和使用这些变量的函数 如上所述,第二个文件中的信息由不同的程序生成,但它使用主文件中的类型声明。同样,主程序使用第二个文件中定义的变量和函数 我尝试过使用“include”和“extern”语句,但都不是很成功。由于这两个文件互相获取信息,将它们分成以下三个文件是否更有用 1) 类型定义 2) 变量声明(使用文件1中定义的类型)和相关函数

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

  • 类型定义、main()和其他函数
  • 变量声明(其类型定义在上面的文件中)和使用这些变量的函数
如上所述,第二个文件中的信息由不同的程序生成,但它使用主文件中的类型声明。同样,主程序使用第二个文件中定义的变量和函数

我尝试过使用“include”和“extern”语句,但都不是很成功。由于这两个文件互相获取信息,将它们分成以下三个文件是否更有用

1) 类型定义

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

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

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


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

如注释中所述,您几乎肯定需要一个标题,称之为
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 );