鱼C论坛

 找回密码
 立即注册
查看: 1362|回复: 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
#include "my.h"

int main(void)
{
  return my_function();
}

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

void my_function2()
{
  int variable2 = 0;
  return 2;
}


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

Administrator@windows MSYS ~/c
# cat hello_cpp.c
# 0 "hello.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "hello.c"
# 1 "my.h" 1
int my_function()
{
  int variable = 0;
  return 1;
}

void my_function2()
{
  int variable2 = 0;
  return 2;
}
# 2 "hello.c" 2

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

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

使用道具 举报

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

使用道具 举报

发表于 2022-6-26 21:11:48 | 显示全部楼层
导入文件所有内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

      顾名思义,include 就是包含的意思,代码编译的时候,被包含文件的全部内容会被物理地插入到 include 语句出现的位置,成为代码文件的一部分内容。
      include 文件一般用在多代码文件项目中,通常是一个代码文件对应一个同名的 include 文件,其中主要定义同名代码文件中用到的数据类型、全局变量、常量、宏、函数声明等内容,一般不会出现实际代码。
想知道小甲鱼最近在做啥?请访问 -> 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程序在写编译指令时,就需要把每个文件名都加上,最终得到一个可执行文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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