C语言-预处理(1)

C语言-预处理(1)文章目录C语言-预处理(1)预处理什么是预处理宏定义无参宏定义带参宏定义宏定义的注意事项条件编译文件包含感谢预处理C 程序编译流程:1. 预处理阶段 2. 编译阶段 3. 汇编阶段 4. 链接阶段 5. 运行可执行程序。如何让编译停在预处理结束的时候呢?用参数 -E,完整的示例为 : gcc -E -o src/example.i src/example.c,...
摘要由CSDN通过智能技术生成

C语言-预处理(1)


C语言-预处理(2)

预处理

C 程序编译流程:1. 预处理阶段 2. 编译阶段 3. 汇编阶段 4. 链接阶段 5. 运行可执行程序。

如何让编译停在预处理结束的时候呢?用参数 -E,完整的示例为 : gcc -E -o src/example.i src/example.c,即:编译 src 目录下的 example.c 文件,在预处理阶段结束后停止,将内容保存到 src 目录下的 example.i 文件中(你甚至可以不用 “.i” 结尾,但这已约定俗成)。

什么是预处理

在说什么是预处理之前,先讲讲预处理的好处吧。那就是:合理使用预处理编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。

预处理阶段由预处理程序负责,这个程序会在进行编译的第一遍扫描(词法扫描和语法分析)之前工作。也就是说,预处理不会对语法什么的做分析,总之 “错就错了,我这里都让过”。

所以预处理要搞啥呢?预处理的任务大致有这 4 点:1. 删除注释;2. 插入被 #include 指令包含的文件内容; 3. 定义和替换由 #define 指令定义的符号(也叫宏替换或宏扩展);**4. **条件编译。

预处理需要处理的是预处理部分,而预处理部分由预处理指令构成。C 语言对预处理指令的格式要求为:

  • # 开头;
  • 占单独书写行(自然可以用连字符 “\” ,但你应该确保反斜线是换行符前的最后一个字符);
  • 语句尾不加分号。

接下来就针对性的说说 宏定义 、条件编译 和 文件包含。

宏定义

C 语言中允许用一个标识符表示一个文本(文本可以是字符串,数字,代码语句),这个标识符称为。在预处理时,对程序中所有出现的宏,都用宏定义中的文本替换,这个过程称为宏替换宏展开。如:

#define PI 3.1415926  // PI 称为宏   // 文本是 浮点数
#define MY_NAME "Jone"  // 文本为 字符串
#define GREET printf("hello")  // 文本为 代码语句

宏定义由源程序中的宏定义指令(#define)完成;宏替换由预处理程序自动完成。C 语言中,宏定义分为:无参宏定义带参宏定义

无参宏定义

语法结构:

#define 标识符(宏名) [文本(宏体)]

功能:定义可在程序中使用的宏,宏的内容由文本(宏体)替代。像是下面这段代码:

// example.c
#define WORD "hello, world"

int main()
{
   
    printf("%s", WORD);
}

预处理之后会变成这样:

// example.i
...

int main()
{
   
    printf("%s", "hello, world");
}

可见,预处理部分不见了,WORD 也被宏体取而代之。同时,定义过的宏还可以被取消。取消宏有两种方式,一种是 “缺省宏体”;另一种是用预处理指令 #undef

两种方式会得到各自不同的结果:

// example.c
#define WORD "hello, world"
#define WORD  // 缺省宏体

int main()
{
   
    printf("%s", WORD);
}
/***************************/
// example.i
...

int main()
{
   
    printf("%s", );
}
// example.c
#define WORD "hello, world"
#undef WORD  // 预处理命令取消

int main()
{
   
    printf("%s", WORD);
}
/***************************/
// example.i
...

int main()
{
   
    printf("%s"
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值