涵天 发表于 2022-6-26 21:03:44

c语言预编译问题

本帖最后由 涵天 于 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 21:07:30

哎呀my.h里面 第二个函数 void 返回2了 不过应该不影响这个问题吧 (汗

风车呼呼呼 发表于 2022-6-26 21:11:48

导入文件所有内容

涵天 发表于 2022-6-26 21:14:02

风车呼呼呼 发表于 2022-6-26 21:11
导入文件所有内容

那为啥在预编译 时已经把头文件 全部复制进来 然后编译 汇编 之后为啥还要链接? 有点不懂 如果能回复一下就非常感谢了。。。

jackz007 发表于 2022-6-26 21:58:08

本帖最后由 jackz007 于 2022-6-26 22:09 编辑

      顾名思义,include 就是包含的意思,代码编译的时候,被包含文件的全部内容会被物理地插入到 include 语句出现的位置,成为代码文件的一部分内容。
      include 文件一般用在多代码文件项目中,通常是一个代码文件对应一个同名的 include 文件,其中主要定义同名代码文件中用到的数据类型、全局变量、常量、宏、函数声明等内容,一般不会出现实际代码。

风车呼呼呼 发表于 2022-6-26 22:01:58

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

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