c语言基础----宏

在 C 语言中,可以采用命令 #define 来定义宏。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。

没有参数的宏 / 宏常量

#define 宏名称 替换文本

宏语句

#define Print printf("hello world!")

带参数的宏

#define 宏名称( [形参列表] ) 替换文本
#define 宏名称( [形参列表 ,] ... ) 替换文本

你可以定义具有形式参数(简称“形参”)的宏。当预处理器展开这类宏时,它先使用调用宏时指定的实际参数(简称“实参”)取代替换文本中对应的形参。带有形参的宏通常也称为类函数宏(function-like macro)。“形参列表”是用逗号隔开的多个标识符,它们都作为宏的形参。当使用这类宏时,实参列表中的实参数量必须与宏定义中的形参数量一样多(然而,C99 允许使用“空实参”)。这里的省略号意味着一个或更多的额外形参。
当定义一个宏时,必须确保宏名称与左括号之间没有空白符。如果在名称后面有任何空白,那么命令就会把宏作为没有参数的宏,且从左括号开始采用替换文本。

 

可选参数

C99 标准允许定义有省略号的宏,省略号必须放在参数列表的后面,以表示可选参数。你可以用可选参数来调用这类宏。
当调用有可选参数的宏时,预处理器会将所有可选参数连同分隔它们的逗号打包在一起作为一个参数。在替换文本中,标识符 __VA_ARGS__ 对应一组前述打包的可选参数。标识符 __VA_ARGS__ 只能用在宏定义时的替换文本中。
__VA_ARGS__ 的行为和其他宏参数一样,唯一不同的是,它会被调用时所用的参数列表中剩下的所有参数取代,而不是仅仅被一个参数取代。

可选参数宏的示例:

// 假设我们有一个已打开的日志文件,准备采用文件指针fp_log对其进行写入
#define printLog(...) fprintf( fp_log, __VA_ARGS__ )
// 使用宏printLog
printLog( "%s: intVar = %d
", __func__, intVar );
//预处理器把最后一行的宏调用替换成下面的一行代码:
fprintf( fp_log, "%s: intVar = %d
", __func__, intVar );

预定义的标识符 __func__ 可以在任一函数中使用,该标识符是表示当前函数名的字符串。因此,该示例中的宏调用会将当前函数名和变量 intVar 的内容写入日志文件。

字符串化运算符

字符串化指的是,可以在宏的参数前面加入#,使入参变成字符串。

#include <stdio.h>
#define str(expr) printf("%s
", #expr)
 
int main()
{
    str(abc);
    str(12345);
    return 0;
}
 
这里运行代码会打印:
 
abc
12345

换行符 ""

有多条语句时,我们就在每行末尾(除了最后一行)加上"",代表换行的意思

连接符号

在宏中,可以使用两个#将两个符号连接成一个符号。

撤销宏定义

#define PI 3.141592654// code
#undef PI
//下面开始 PI 就失效了

 相关文章:C语言宏的用法详解

           C语言_宏定义

原文地址:https://www.cnblogs.com/xuey/p/12210386.html