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

