欢迎光临
我们一直在努力

day 11 C预处理,宏,条件编译

一、预处理

目的:

以改进程序设计环境,提高编程效率。不是c语句,也不是c的一部分 —  编译系统的一部分。

预处理与C语言的区别

预处理是C语言编译过程中的一个独立阶段,发生在实际编译之前。它通过预处理器对源代码进行文本级别的处理,生成修改后的源代码供编译器使用。C语言是编程语言本身,包含语法、语义和运行时行为。

编译代码:

预处理:给后面的编译做预备工作—处理完之后,得到一个纯的c语言文件。-E

编译:将纯的c代码,编译为对应平台汇编代码。                                           -S

汇编:将汇编代码,翻译为机器指令。                                                           -c

链接:将用到的相关代码链接成最终的可执行文件。                   gcc          *.o目标文件

gcc -E hello.c -o hello.i 预处理
gcc -s hello.i -o hello.s 编译
gcc -c hello.s -o hello.o 汇编
gcc hello.o -o hellots 链接
./hello

二、宏

宏的定义与用途

宏(Macro)是一种通过预定义的指令或代码片段来简化重复性任务的工具。通常用于编程、文档处理(如Excel)、自动化脚本等领域。宏可以显著提高效率,减少人工操作错误。

1.预处理阶段核心就是干一个事情:文本替换

        宏定义就是用宏值替换宏名。

2.好处:方便修改,可以做到一改全改;提高代码可读性。

带参宏的定义与用途

带参宏(Parameterized Macro)是预处理器中通过#define定义的宏,允许接收参数并在代码展开时替换。常用于简化重复代码、定义常量表达式或条件编译。

#define 宏名(参数表) 字符串
#define 宏名(参数表) 宏值
#define S(r) PI*r*r //带参宏–形式上类似函数,但是不是函数

处理阶段:
带参宏—预处理阶段处理完成,参数没类型(简短不要超过5行代码)
函数:编译阶段进行编译,参数有类型

#define S(r) (PI*(r)*(r)) 宏展开后的副作用避免:一般给宏定义是能加括号的地方都加上。
宏名约定为大写主要是和变量名函数名以区分。
#define 宏定义这一行不要加分号。

#undef 宏名 //终止宏作用
结束标志:换行。

宏名也有作用域:在预处理发挥作用。宏从定义处开始都有效。

文件包含:
#include "" //默认先从当前位置下,寻找要包含的文件,找不到,再到系统默认路径下寻找
#include <> ////直接到系统默认路径下寻找,而不在当前位置下寻找

#include <stdio.h>//作用将stdio.h文件中的内容最终替换到这个位置

三、条件编译(选择编译哪些代码)

形式1
#ifdef 标识符
程序段1
#else
程序段2
#endif //含义:如果定义了标识符则编译程序段1,否则编译程序段2。

形式2
#ifndef
标识符程序段1
#else
程序段2
#endif // 如果没有定义标识符则编译程序段1否则编译程序段2

形式3
#if 0

#endif

gcc ifdef.c -DDEBUG = #define DDEBUG

赞(0)
未经允许不得转载:171主机测评 » day 11 C预处理,宏,条件编译
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址