如月ya 发表于 2023-3-16 14:21:59

求问对于一个完整的c程序文件是怎么组成的

我学c一直是用的vs,学cpp到12章讲存储期、作用域和链接的时候学的很模糊,感觉知识都落不了地,一直没搞清楚文件组成,求大佬解答一下我的疑惑万分感谢。
我使用vs一直都是新建一个空项目然后在空项目里建立一个源文件,所有的代码就在这个源文件里敲。
我一直的认知是
一个完整的c语言程序,等同于vs里一个完整的项目,
一个项目里可以有很多个源文件,一个源文件里可以有很多个源代码,然后一个源代码里可以有很多个头文件
然后一个 源代码+其所包含的头文件 = 一个翻译单元 (如果有2个不同的源代码,但是他们的头文件里都包含了stdio.h,那程序预加载的时候是每个给一份还是相同的都共用一个?)
还是拿一个源代码专门放所有的头文件,然后这些头文件作用于整个源文件?

编译器是不是先用对应的头文件内容替换掉源代码中的#include指令,然后将所有的源代码串成一个源文件,然后将所有的源文件串成一个完整的c程序?
如果是这样,那编译器将他们串联起来的时候,它怎么知道哪个先哪个后?
在这样的框架下,什么叫翻译单元?这个单元是指什么?什么叫预处理文件?文件和程序的关系是不是一个或多个文件才能组成一个程序?

我知道问题很多,但是我真的查了很多地方,都是很零碎的说,或者不依托于vs我看不懂,真心大佬的帮助{:5_111:}

isdkz 发表于 2023-3-16 14:31:16

首先,让我们澄清一些概念。一个完整的 C 语言程序可以由多个源代码文件组成,每个源代码文件可以包含多个函数定义和其他 C 语言语句。一个头文件是一个包含 C 语言声明和定义的文件,通常用于共享函数、宏、结构体和其他定义。每个源代码文件可以包含多个头文件,并且在编译时,每个头文件都会被翻译成一个预处理文件。

现在,让我们回答您的问题:

1.一个源代码+其所包含的头文件 = 一个翻译单元(如果有2个不同的源代码,但是他们的头文件里都包含了stdio.h,那程序预加载的时候是每个给一份还是相同的都共用一个?)

每个源代码文件+其所包含的头文件被视为一个翻译单元,但是多个源代码文件可以包含相同的头文件。在这种情况下,预处理器只会处理一次头文件,并且在编译时,所有包含该头文件的源代码文件都会使用相同的预处理文件。

2.编译器是不是先用对应的头文件内容替换掉源代码中的#include指令,然后将所有的源代码串成一个源文件,然后将所有的源文件串成一个完整的c程序?

编译器在编译过程中会首先进行预处理,预处理器会处理 #include 指令,并将所有包含的头文件插入到源代码文件中,然后生成预处理文件。接下来,编译器会编译所有源代码文件,并将它们连接成一个可执行程序或库。

3.如果是这样,那编译器将它们串联起来的时候,它怎么知道哪个先哪个后?

编译器在连接时会将每个源代码文件编译成一个目标文件,然后将所有目标文件链接起来生成可执行程序或库。在链接过程中,编译器会解析所有函数的定义和引用,并在必要时调整函数的位置,以确保所有的函数都能正确链接。

4.在这样的框架下,什么叫翻译单元?这个单元是指什么?什么叫预处理文件?文件和程序的关系是不是一个或多个文件才能组成一个程序?

翻译单元是指一个源代码文件+其所包含的头文件。预处理文件是在预处理过程中生成的中间文件,其中包含了所有头文件的声明和定义,以及处理后的源代码。程序可以由一个或多个源代码文件组成,每个源代码文件可以包含多个函数定义和其他语句。在编译时,每个源代码文件都会被编译成一个目标文件,然后链接在一起生成可执行程序

如月ya 发表于 2023-3-16 14:32:59

顺便问一下,第13章文件I/O,我怎么和文件交互.....书上的例子和函数我怎么去跟着尝试,是依托于控制台吗,控制台可以直接使用 fopen(), fgets()这种函数?
对应的,main()函数两个参数,我怎么输入字符串去使用程序,因为我一直是建立的windows桌面向导,然后控制台应用程序(空项目),然后再新建源文件这样子在使用的

如月ya 发表于 2023-3-16 15:04:52

isdkz 发表于 2023-3-16 14:31
首先,让我们澄清一些概念。一个完整的 C 语言程序可以由多个源代码文件组成,每个源代码文件可以包含多个 ...

vs里,一个项目下有一个源文件,源文件下可以建立很多个 .c 文件,是不是这个源文件就是您说的源代码文件,然后那些 .c 文件就是源代码?
然后它和源文件同级的还有个头文件夹,我可以在里面新建欸,是不是一般不用管,它是编译器在预处理的时候放头文件的地方?那为什么用户可以自己新建头文件,毕竟如果代码里没有写,自己导进去也用不上,如果写了编译器会自己加进去啊。
那这样说,头文件和源代码文件(也就是源文件)其实是同级别的,并不是谁被谁包含,只是写代码的时候会把要包含的头文件写在源代码里?
那请问,例如我有三个源代码,一个放需要包含的头文件,一个放main(),一个放其他的函数定义,我运行的.exe文件编译器会自动把他们处理成一个可执行程序?

wp231957 发表于 2023-3-16 15:11:29

如月ya 发表于 2023-3-16 14:32
顺便问一下,第13章文件I/O,我怎么和文件交互.....书上的例子和函数我怎么去跟着尝试,是依托于控制台吗, ...

感觉用vs 去学c有些太庞大的感觉

简单来讲,新手入门级c 语言都是控制台程序   非常简单
就是把XXX.H+XXX.LIB+XXX.C这些编译链接成XXX.EXE然后就能在cmd 模式下运行这个exe并看到一些结果

如月ya 发表于 2023-3-16 15:21:19

wp231957 发表于 2023-3-16 15:11
感觉用vs 去学c有些太庞大的感觉

简单来讲,新手入门级c 语言都是控制台程序   非常简单


因为一开始学不知道去哪里敲代码,后来知道了gcc,vc,vs,我不知道怎么新建文件之类的,找了很久b站有个人讲了这些最基础最基础的东西,他建议用vs我也就跟着他教的操作一步一步来了,一直就没变。
其实就算用别的编译器,学到这里还是要知道程序的构成文件是什么的,抱歉,我学到结构那里,它又和文件这块的内容有交集,我不想越拖越久,想先把前面的基础彻底弄懂才来问的{:5_99:}

wp231957 发表于 2023-3-16 15:25:18

如月ya 发表于 2023-3-16 15:21
因为一开始学不知道去哪里敲代码,后来知道了gcc,vc,vs,我不知道怎么新建文件之类的,找了很久b站有个 ...

对于新手级菜鸟来讲,头文件不需要自己编lib静态库不需要自己链接
我们唯一知道的就是如何把 XXX.C   链接成XXX.EXE然后去执行这个exe看看能不能输出预期结果
至于一个工程 有多少个头文件有多少个lib有多少个源文件   我认为这都不是新手村级别 需要研究的事情

如月ya 发表于 2023-3-16 15:35:22

wp231957 发表于 2023-3-16 15:25
对于新手级菜鸟来讲,头文件不需要自己编lib静态库不需要自己链接
我们唯一知道的就是如何把 XXX.C    ...

问题就是我学到这里,他讲的就是作用域,链接还有文件I/O这些东西呀,如果不明白工程文件怎么组成的那学这个知识不就是空中楼阁嘛

isdkz 发表于 2023-3-16 15:40:51

如月ya 发表于 2023-3-16 15:04
vs里,一个项目下有一个源文件,源文件下可以建立很多个 .c 文件,是不是这个源文件就是您说的源代码文件 ...

在 Visual Studio 中,一个项目可以包含多个源文件,而每个源文件可以包含多个函数和语句。这些源文件通常都是 C 语言源代码文件,它们的扩展名为 .c。每个源代码文件都是一个独立的编译单元,它包含了一组 C 语言语句和函数定义。可以在同一个项目中包含多个源代码文件,编译器会将它们编译成目标文件,然后将这些目标文件链接成一个可执行文件。

在 Visual Studio 中,头文件通常存储在一个名为"头文件"(Header Files)的文件夹中。头文件包含了函数和变量的声明,通常由源代码文件 #include 指令包含。预处理器会在编译过程中处理这些 #include 指令,并将头文件插入到源代码文件中。如果你需要自定义头文件,可以在头文件夹中创建新的头文件,并在你的源代码文件中使用 #include 指令来包含它们。这样可以将声明和定义与其他源代码文件分离,使代码更易于维护。

关于你的最后一个问题,如果你有多个源代码文件,可以将它们编译成多个目标文件,然后将这些目标文件链接成一个可执行文件。在 Visual Studio 中,可以在同一个项目中包含多个源代码文件,并在“属性”窗口中设置每个源代码文件的编译选项,以将它们编译成目标文件。然后,编译器会将这些目标文件链接在一起生成可执行文件。但请注意,如果你的代码中存在依赖关系,你需要确保在编译和链接时正确地指定文件的顺序,以避免出现错误。

如月ya 发表于 2023-3-16 16:14:41

isdkz 发表于 2023-3-16 15:40
在 Visual Studio 中,一个项目可以包含多个源文件,而每个源文件可以包含多个函数和语句。这些源文件通 ...

明白了!感谢解答
页: [1]
查看完整版本: 求问对于一个完整的c程序文件是怎么组成的