当前位置:   article > 正文

C语言-预处理(1)_c取消宏定义

c取消宏定义

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")  // 文本为 代码语句
  • 1
  • 2
  • 3

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

无参宏定义

语法结构:

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

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

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

int main()
{
   
    printf("%s", WORD);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

预处理之后会变成这样:

// example.i
...

int main()
{
   
    printf("%s", "hello, world");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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

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

int main()
{
   
    printf("%s", );
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
// example.c
#define WORD "hello, world"
#undef WORD  // 预处理命令取消

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

int main()
{
   
    printf("%s"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/756514
推荐阅读
相关标签
  

闽ICP备14008679号