c语言如何增加编译宏,C中的预编译宏定义

本文详细介绍了C语言的预编译宏,包括#define、#undef、#if、#ifdef、#ifndef等预处理命令的使用,以及预处理宏在代码中的应用和注意事项,帮助读者深入理解C语言的预处理阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在将一个C源程序转换为可执行程序的过程中,

编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前,

预处理器首先对源程序中的"宏(macro)"进行处理.

C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了.

编译预处理往往在后台运行. 在有的C编译器中, 这些过程统统由一个单独的程序来完成, 编译的不同阶段实现这些不同的功能.

可以指定相应的命令选项来执行这些功能. 有的C编译器使用分别的程序来完成这些步骤. 可单独调用这些程序来完成.

在gcc中, 进行编译预处理的程序被称为CPP, 它的可执行文件名为cpp.

编译预处理命令的语法与C语言的语法是完全独立的. 比如: 你可以将一个宏扩展为与C语法格格不入的内容, 但该内容与后面的语句结合在一个若能生成合法的C语句,

也是可以正确编译的.

(一)

预处理命令简介

预处理命令由#(hash字符)开头, 它独占一行, #之前只能是空白符. 以#开头的语句就是预处理命令, 不以#开头的语句为C中的代码行.

常用的预处理命令如下:

#define

定义一个预处理宏

#undef

取消宏的定义

#include

包含文件命令

#include_next

与#include相似, 但它有着特殊的用途

#if

编译预处理中的条件命令, 相当于C语法中的if语句

#ifdef

判断某个宏是否被定义, 若已定义, 执行随后的语句

#ifndef

与#ifdef相反, 判断某个宏是否未被定义

#elif

若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if

#else

与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else

#endif

#if,

#ifdef, #ifndef这些条件命令的结束标志.

defined

与#if, #elif配合使用,

判断某个宏是否被定义

#line

标志该语句所在的行号

#

将宏参数替代为以参数值为内容的字符窜常量

##

将两个相邻的标记(token)连接为一个单独的标记

#pragma

说明编译器信息

#warning

显示编译警告信息

#error

显示编译错误信息

(二)

预处理的文法

预处理并不分析整个源代码文件, 它只是将源代码分割成一些标记(token), 识别语句中哪些是C语句, 哪些是预处理语句.

预处理器能够识别C标记, 文件名, 空白符, 文件结尾标志.

预处理语句格式:    #command

name(...) token(s)

1, command预处理命令的名称, 它之前以#开头, #之后紧随预处理命令, 标准C允许#两边可以有空白符,

但比较老的编译器可能不允许这样. 若某行中只包含#(以及空白符), 那么在标准C中该行被理解为空白. 整个预处理语句之后只能有空白符或者注释,

不能有其它内容.

2, name代表宏名称, 它可带参数. 参数可以是可变参数列表(C99).

3, 语句中可以利用"\"来换行.

e.g.

#  define

ONE 1 /* ONE == 1 */

等价于: #define ONE 1

#define err(flag,

msg) if(flag) \

printf(msg)

等价于: #define err(flag,

msg) if(flag) printf(msg)

(三)

预处理命令详述

1,

#define

#define命令定义一个宏:

#define

MACRO_NAME(args) tokens(opt)

之后出现的MACRO_NAME将被替代为所定义的标记(tokens). 宏可带参数, 而后面的标记也是可选的.

对象宏

不带参数的宏被称为"对象宏(objectlike macro)"

#define经常用来定义常量, 此时的宏名称一般为大写的字符串. 这样利于修改这些常量.

e.g.

#define MAX 100

int a[MAX];

#ifndef

__FILE_H__ #define

__FILE_H__ #include

"file.h"

#endif

#define __FILE_H__ 中的宏就不带任何参数, 也不扩展为任何标记. 这经常用于包含头文件.

要调用该宏, 只需在代码中指定宏名称, 该宏将被替代为它被定义的内容.

函数宏

带参数的宏也被称为"函数宏". 利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈,

这一过程如果过于频繁会耗费掉大量的CPU运算资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值