鱼C论坛

 找回密码
 立即注册
查看: 1652|回复: 5

[已解决]c语言预编译问题

[复制链接]
发表于 2022-6-26 21:03:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 涵天 于 2022-6-26 21:06 编辑

c的预编译 #include <stdio.h> 是把所有 头文件内容 导入 还是 只导入函数声明?   为什么我用 #include "my.h" 导入自己写的简单头文件时, 再用 gcc -E 只进行预编译 出来的 预编译文件打开会显示 出完整的定义的函数?
这是hello.c

  1. #include "my.h"

  2. int main(void)
  3. {
  4.   return my_function();
  5. }
复制代码


这是my.h
  1. int my_function()
  2. {
  3.   int variable = 0;
  4.   return 1;
  5. }

  6. void my_function2()
  7. {
  8.   int variable2 = 0;
  9.   return 2;
  10. }
复制代码



  1. # gcc -E hello.c -o hello_cpp.c

  2. Administrator@windows MSYS ~/c
  3. # cat hello_cpp.c
  4. # 0 "hello.c"
  5. # 0 "<built-in>"
  6. # 0 "<command-line>"
  7. # 1 "hello.c"
  8. # 1 "my.h" 1
  9. int my_function()
  10. {
  11.   int variable = 0;
  12.   return 1;
  13. }

  14. void my_function2()
  15. {
  16.   int variable2 = 0;
  17.   return 2;
  18. }
  19. # 2 "hello.c" 2

  20. int main(void)
  21. {
  22.   return my_function();
  23. }
复制代码

求解 谢谢!
最佳答案
2022-6-26 22:01:58
涵天 发表于 2022-6-26 21:14
那为啥在预编译 时已经把头文件 全部复制进来 然后编译 汇编 之后为啥还要链接? 有点不懂 如果能回复一 ...

1.我不太了解是否有书籍上这么说,我印象里的第一步应该是叫作“预处理”,做一些文本式的处理(比如删除注释,按照预处理命令替换内容)
2.标准函数库包含头文件和库文件(分别存放标准函数的声明和具体定义),#include<stdio.h> 里面只是函数声明,假设要使用printf ()函数,那么就会把相应库函数链接到一起来。
3.也许你是初学,一个C程序是可以包含多个源文件的,所以需要链接。实际上,若你函数定义的那个文件与main函数文件在同一目录下,不使用include指令同样可以调用。如果是Linux环境就更直观,包含多个源文件的C程序在写编译指令时,就需要把每个文件名都加上,最终得到一个可执行文件
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-26 21:07:30 | 显示全部楼层
哎呀my.h里面 第二个函数 void 返回2了 不过应该不影响这个问题吧 (汗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-26 21:11:48 | 显示全部楼层
导入文件所有内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-26 21:14:02 | 显示全部楼层

那为啥在预编译 时已经把头文件 全部复制进来 然后编译 汇编 之后为啥还要链接? 有点不懂 如果能回复一下就非常感谢了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-26 21:58:08 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-6-26 22:09 编辑

      顾名思义,include 就是包含的意思,代码编译的时候,被包含文件的全部内容会被物理地插入到 include 语句出现的位置,成为代码文件的一部分内容。
      include 文件一般用在多代码文件项目中,通常是一个代码文件对应一个同名的 include 文件,其中主要定义同名代码文件中用到的数据类型、全局变量、常量、宏、函数声明等内容,一般不会出现实际代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-26 22:01:58 | 显示全部楼层    本楼为最佳答案   
涵天 发表于 2022-6-26 21:14
那为啥在预编译 时已经把头文件 全部复制进来 然后编译 汇编 之后为啥还要链接? 有点不懂 如果能回复一 ...

1.我不太了解是否有书籍上这么说,我印象里的第一步应该是叫作“预处理”,做一些文本式的处理(比如删除注释,按照预处理命令替换内容)
2.标准函数库包含头文件和库文件(分别存放标准函数的声明和具体定义),#include<stdio.h> 里面只是函数声明,假设要使用printf ()函数,那么就会把相应库函数链接到一起来。
3.也许你是初学,一个C程序是可以包含多个源文件的,所以需要链接。实际上,若你函数定义的那个文件与main函数文件在同一目录下,不使用include指令同样可以调用。如果是Linux环境就更直观,包含多个源文件的C程序在写编译指令时,就需要把每个文件名都加上,最终得到一个可执行文件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 05:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表