C 语言中的预处理器运算符
预处理器运算符是在 #define 命令上下文中使用的特殊符号。这些运算符也称为预处理器专用运算符。
C 语言定义了一组预处理器运算符,每个运算符都附带一个重要的操作。在本章中,我们将讲解 C 语言中使用的不同类型的预处理运算符。
大多数现代 C 编译器都实现了以下预处理运算符 -
运算符 | 操作 |
---|---|
继续运算符 (/) | 用于继续一行内容过长的宏。 |
字符串化运算符 (#) | 将相应的实际参数括在双引号中 |
标记粘贴运算符 (##) | 允许使用标记作为实际参数连接起来形成其他标记 |
定义运算符 | 简化某些宏指令中复合表达式的编写 |
现在让我们详细讨论一下这些预处理运算符。
延续运算符 (/)
此运算符用于宏非常复杂且跨越多行的情况。如果宏扩展内部逻辑复杂,则需要断行并编写跨越多行的代码。在这种情况下,宏延续运算符非常有用。
示例 1:预处理延续运算符 (/)
在下面的示例中,我们将在下一行编写宏的一部分,因此我们使用了宏延续预处理运算符 (\)。
#include <stdio.h> #define message() { \ printf("TutorialsPoint Library contains "); \ printf("High quality Programming Tutorials"); \ } int main() { message(); return 0; }
输出
运行此代码时,将产生以下输出 -
TutorialsPoint Library contains High quality Programming Tutorials
示例 2:预处理器延续运算符 (/)
在以下示例中,宏定义涉及 switch case 语句的求值,因此它跨越多行,需要使用宏延续符。
#include <stdio.h> #define SHAPE(x) switch(x) { \ case 1: printf("1. CIRCLE "); break; \ case 2: printf("2. RECTANGLE "); break; \ case 3: printf("3. SQUARE "); break; \ default: printf("default. LINE "); \ } int main() { SHAPE(1); SHAPE(2); SHAPE(3); SHAPE(0); return 0; }
输出
运行此代码时,将产生以下输出 -
1. CIRCLE 2. RECTANGLE 3. SQUARE default. LINE
字符串化运算符 (#)
有时您可能需要将宏参数转换为字符串常量。数字符号或"字符串化"运算符 (#) 可以将宏参数转换为字符串字面量,而无需扩展参数定义。此运算符只能在具有指定参数或参数列表的宏中使用。
示例 1:字符串化运算符
请看以下示例 -
#include <stdio.h> #define stringize(x) printf(#x " ") int main() { stringize(Welcome To TutorialsPoint); stringize("The Largest Tutorials Library"); stringize("Having video and Text Tutorials on Programming Languages"); }
输出
运行此代码时,将产生以下输出 -
Welcome To TutorialsPoint "The Largest Tutorials Library" "Having video and Text Tutorials on Programming Languages"
示例 2:字符串化运算符
以下代码展示了如何使用字符串化运算符将文本转换为字符串,而无需使用引号。
#include <stdio.h> #define STR_PRINT(x) #x main() { printf(STR_PRINT(This is a string without double quotes)); }
输出
运行代码并检查其输出 −
This is a string without double quotes
标记粘贴运算符 (##)
双数字符号或标记粘贴运算符 (##),有时也称为合并运算符或组合运算符。在扩展宏时,将两个标记合并为一个通常很有用。
扩展宏时,每个"##"运算符两侧的两个标记会合并为一个标记,然后在宏扩展中替换"##"和两个原始标记。
示例 1:标记粘贴运算符 (##)
请看以下示例 -
#include <stdio.h> #define PASTE(arg1,arg2) arg1##arg2 main() { int value_1 = 1000; printf("value_1 = %d ", PASTE(value_,1)); }
输出
运行此代码时,将产生以下输出 -
value_1 = 1000
示例 2:标记粘贴运算符 (##)
在下面的示例中,我们向宏传递了两个参数。
#include <stdio.h> #define TOKENS(X, Y) X##Y int main() { printf("value1: %d ",TOKENS(12,20)); printf("value2: %d ",TOKENS(12,20)+10); return 0; }
输出
运行此代码时,将产生以下输出 -
value1: 1220 value2: 1230
defined 运算符
defined 预处理运算符只能作为 #if 和 #elif 指令的一部分使用。defined 运算符的语法如下:-
#ifdefined(macro1) // code #elifdefined(macro2) // code #endif
它用于常量表达式中,用于判断标识符是否已定义。如果指定的标识符已定义,则值为 true(非零)。如果符号未定义,则值为 false(零)。
示例 1:defined 运算符
在此示例中,defined 运算符用于检查 DEBUG 宏是否已定义。如果已定义,则程序打印"DEBUG mode is on"。否则,它会打印"DEBUG 模式已关闭"。
#include <stdio.h> #define DEBUG 1 int main() { #if defined(DEBUG) printf("DEBUG mode is on. "); #else printf("DEBUG mode is off. "); #endif return 0; }
输出
运行代码并检查其输出 −
DEBUG mode is on.
示例 2:defined 运算符
以下代码检查 square 宏是否已定义,如果是,则使用给定的"x"值 5 对其进行扩展。
#include <stdio.h> #define square(x) ((x) * (x)) int main(){ #if defined square printf("The square of the given number is: %d", square(5)); #endif return 0; }
输出
运行此代码时,将产生以下输出 -
The square of the given number is: 25