高级C语言-宏定义与预处理,函数和函数库

C语言预处理理论

源码到可执行程序的过程
(1)源码.c->(预处理)->预处理过得.i源文件->(编译)->汇编文件.s->(汇编)->目标文件.o->(链接)->elf可执行程序
(2)预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具加上其他一些额外的工具合起来叫编译工具链。gcc就是一个编译工具链
预处理的意义
(1)编译器本身的主要目的是编译源代码,将C的源代码转化成.S的汇编代码。编译器聚焦核心功能后,剥离出一些编译前的杂事
(2)预处理器帮编译器做一些编译前的杂事
编程中常见的预处理
(1)#include(#include <>和#include ""的区别)
(2)注释
(3)#if #endif #ifdef
(4)宏定义
gcc中只预处理不编译的方法
(1)gcc编译时可以给一些参数来做一些设置,譬如gcc xx.c -o xx可以指定可执行程序的名称;
(2)gcc xx.c -c -o xx.o可以指定只编译不连接,也可以生成.o的目标文件
(3)gcc -E xx.c -o xx.i可以实现只预处理不编译。一般情况下没必要只预处理不编译,但是有时候这种技巧可以用来帮助我们研究预处理过程,帮助debug程序
(4)总结:宏定义被预处理时的现象有:第一,宏定义语句本身不见了(可见编译器根本就不认识#define,编译器根本不知道还有个宏定义);第二,typedeef重命名语言还在,说明它和宏定义是有本质区别的(说明typedef是由编译器来处理而不是预处理器处理的)

C语言预处理代码实战

头文件包含
(1)#include <>和#include ““的区别;<>专门用来包含系统提供的头文件(就是系统自带的,不是程序员写的),” “用来包含自己写的头文件;更深层次来说:<>的话C语言编译器只会到系统指定目录(编译器中配置的或者操作系统配置的寻找目录,譬如在ubuntu中的是/usr/include目录,编译器还允许用-i来附加指定其他的包含路径)去寻找这个头文件(隐含意思就是不会找当前目录下),如果找不到就会提示这个头文件不存在
(2)”“包含的头文件,编译器默认会先在当前目录下寻找响应的头文件,如果没找到然后再到系统指定,目录去寻找,如果还没找到则提示文件不存在。
(3)总结+注意:规则虽然允许用双引号来包含系统指定目录,但是一般的使用原则是:如果是系统指定的自带的用<>,如果是字节写的在当前目录下放着用””,如果是自己写的但是集中放在了一起专门存放在头文件的目录下将来在编译器中用-I参数来寻找,这种情况下用<>。
(4)头文件包含的真实含义就是:在#include<xx.h>的哪一行,将xx.h个头文件的内容原地展开替换这一行#include语句。过程在预处理中进行。
注释
(1)注释是给人看的,不是给编译器看的。
(2)编译器既然不看注释,那么编译时最好没有注释。实际上在预处理阶段,预处理器会拿掉程序中所有的注释语句,到了编译器阶段程序中其实已经没有注释了。

#include<stdio.h>

#define NUM
#define mmm 1
int main(void)
{
   
    #ifdef NUM
    {
   
        int a = 2233;
        printf("a = %d.\n",a);
    }
    #else
    {
   
        int b = 22 33; 
        printf("a = %d.\n",b);
    }
    #endif

    #if (mmm == 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值