椋鸟C语言笔记#37:预处理指令

萌新的学习笔记,写错了恳请斧正。


目录

预定义符号

预处理指令#define

#define定义的宏常量

使用续行符扩展#define的功能

#define定义宏

使用宏时不要使用有副作用的参数

编译器到底是怎么处理宏的

宏与函数的对比

约定俗成的命名规则

#与##运算符

#运算符(字符串化)

##运算符(记号粘合)

#undef指令

命令行定义

条件编译

#include包含头文件

包含库文件

包含本地头文件

标准路径

嵌套文件包含

其他预处理指令


预处理指令就是C语言中的一些特定格式的用于辅助编译器预处理的指令,这些指令在编译时的预处理阶段就被处理,并不会被保留到汇编文件中。

预定义符号

首先是一些内置的预定义符号,这些符号可以直接使用,在预处理阶段就被替换为对应的其他内容

包括(注意前后都是两个下划线):

  • __FILE__:替换为源文件的文件名(包括地址与后缀)
  • __LINE__:替换为文件中此符号所在行的行号
  • __DATE__:替换为文件被编译的日期
  • __TIME__:替换为文件被编辑的时间
  • __STDC__:如果编译器遵循ANSI C标准,这将被替换为1,否则未定义

预处理指令#define

#define定义的宏常量

#define可以在预处理时把程序中的某个字段直接替换为另一个字段,然后在继续编译

注意:

  • #define之间可以嵌套
  • #define的第一个字段(被替换字段)必须全连续(不能存在空白字符),而第二个字段可以存在空白字符甚至多行字符(需要续行符辅助)
  • #define的定义不能产生循环

使用示例如下(输出100):

#include <stdio.h>
#define M 100
#define __p printf
#define PRINT __p("%d", M)

int main()
{
    PRINT;
    return 0;
}

注:如果不写替换字段,则默认替换为1

使用续行符扩展#define的功能

上面提到可以使用续行符来完成多行的替换,具体怎么操作呢?

其实很简单,只要正常分行,前面每一行的结尾都加上一个反斜杠即可(反斜杠后就是换行符,之间不能再有任何其他字符!!!),比方说:

#include <stdio.h>
#define DEBUG_PRINT printf("file:%s\nline:%d\ndate:%s\ntime:%s\n",\
                            __FILE__, __LINE__,\
                            __DATE__, __TIME__ \
                        )

int main()
{
    DEBUG_PRINT;
    return 0;
}
#define定义宏

#define指令还包含一个机制,就是宏定义功能

宏定义可以理解为一种另类的“函数”,可以进行多字段的替换

其声明方式为:

#define name(parament_list) stuff
// name是宏的名称
// parament_list是参数列表,类似于函数的参数列表
// stuff是替换内容

其功能就是将stuff中所有的与参数列表相同的字段替换为我们使用时输入的字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椋鸟Starling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值