项目运用的背景如下: 项目中有个头文件中定义了一个宏定义,比如是 #define CFG_LOGGER_NAME uart 然后,在某个C文件中需要讲这个3转换成对应的字符串类型,即为"uart";很明显,如果按以下的几种方式定义,肯定得不到期望的结果: 方式1: #define CFG_LOGGER_NAME_STR "CFG_LOGGER_NAME" 方式2: #define CFG_L...
可以通过#define取消名字的宏定义,这样做可以保证后续的调用是函数调用,而不是宏调用: #undefgetcharintgetchar(void){ ... } 4. 宏参数、#和## 如果在宏定义的替换文本中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串。例如,可以将它与字符串连接运算结合起来编写一个调试打印宏:...
C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。带参宏定义的一般形式为:#define 宏名(形参列表) 字符串 在字符串中可以含有各个形参。带参宏调用的一般形式为:宏名...
2. 记号黏结(##) 与#运算符类似,##运算符可用于函数式宏的替换部分,它把两个记号组合成一个记号。例如,可以这样定义函数式宏: #define XNAME(n) x ## n 然后,展开宏XNAME(4)为x4。 记号黏结的作用是将几个预处理记号合并为一个。在一个函数式宏定义中,如果一个预处理记号的前面或者后面有"##",则...
在上述代码中,宏定义 MAX(a,b) 带有两个参数 a 和 b,它的作用是返回这两个参数的最大值。在 main 函数中,我们调用了 MAX(x, y) 宏定义,它会在编译时被替换为 ((x) > (y) ? (x) : (y)),最终计算出 x 和 y 的最大值并输出。宏定义中的字符串拼接 在宏定义中可以使用 ## 运算符对...
C语言宏是一种预处理指令,用于在程序编译之前进行文本替换。它可以把一个标识符替换为一个特定的字符串、表达式或代码块。使用宏可以减少代码的重复性、提高代码的可读性和可维护性,并且可以使代码更加灵活和可定制化。 1.2 — 宏定义和函数的比较 ...
2. 带参数的宏定义:除了一般的字符串替换,还要做参数代换格式: #define 宏名(参数表) 字符串 例如:#define S(a,b) a*barea=S(3,2); 第一步被换为area=a*b; , 第二步被换为area=3*2; 类似于函数调用,有一个哑实结合的过程: (1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b)...
PRINT_FORMAT宏仅接受格式化字符串和可变数量的参数,不附加任何颜色属性。它仅使用printf函数直接输出格式化的文本。 下面是使用这些宏来打印不同颜色和格式的文本的示例: intmain(void){intnum=10;constchar*str="Hello, World!";// 使用不同颜色和格式输出// 输出红色数字PRINT_COLOR(RED,"Number: %d\n",num...
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。 命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1) 简单的宏定义: #define <宏名> <字符串>
常见的宏定义分为两种:无参宏定义和带参宏定义。2. 无参宏定义 定义格式:替换列表里面可以是数值常数、字符常数、字符串常数等,因此可以理解为使用标识符来表示常量,所以也被叫作符号常量。预处理指令不是语句,因此在预处理指令的末尾是无需加上分号的。如果加上分号,可能会获得超出预期的结果。虽然预处理...