C语言预处理器操作符



预处理器操作符是在#define指令的上下文中使用的特殊符号。这些操作符也称为预处理器专用操作符。

在C语言中,定义了一组预处理器操作符,每个操作符都附带一个重要的操作。本章将解释在C语言中使用的不同类型的预处理器操作符。

大多数现代C编译器都实现了以下预处理器操作符:

操作符 作用
续行操作符 (/) 用于续接过长的宏。
字符串化操作符 (#) 将对应的实际参数用双引号括起来。
标记粘贴操作符 (##) 允许将用作实际参数的标记连接起来以形成其他标记。
defined 操作符 简化在某些宏指令中编写复合表达式的过程。

现在让我们详细讨论每个预处理器操作符。

续行操作符 (/)

当宏非常复杂且跨越多行时,使用此操作符。如果宏展开中的逻辑很复杂,则需要换行并编写跨越多行的代码。在这种情况下,宏续行操作符非常有用。

示例1:预处理器续行操作符 (/)

在下面的示例中,我们在下一行编写宏的一部分,因此我们使用了宏续行预处理器操作符 (\)。

#include <stdio.h>

#define  message() { \
   printf("TutorialsPoint Library contains\n"); \
   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\n"); break; \  
   case 2: printf("2. RECTANGLE\n"); break; \  
   case 3: printf("3. SQUARE\n"); break; \  
   default: printf("default. LINE\n"); \  
} 

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 "\n")

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\n", PASTE(value_,1));
}

输出

运行此代码时,将产生以下输出:

value_1 = 1000

示例2:标记粘贴操作符 (##)

在下面的示例中,我们将两个参数传递给宏。

#include <stdio.h>
#define TOKENS(X, Y) X##Y

int main() {

   printf("value1: %d\n",TOKENS(12,20));
   printf("value2: %d\n",TOKENS(12,20)+10);  
   return 0;
}

输出

运行此代码时,将产生以下输出:

value1: 1220
value2: 1230

defined 操作符

defined 预处理器操作符只能用作**#if**和**#elif**指令的一部分。defined 操作符的语法如下:

#if defined(macro1)   
// code
#elif defined(macro2)   
// code
#endif  

它用于在常量表达式中确定是否定义了标识符。如果定义了指定的标识符,则值为真(非零)。如果未定义该符号,则值为假(零)。

示例1:defined 操作符

在此示例中,defined 操作符用于检查是否定义了 DEBUG 宏。如果已定义,则程序打印“DEBUG 模式已开启”。否则,它打印“DEBUG 模式已关闭”。

#include <stdio.h>

#define DEBUG 1

int main() {

   #if defined(DEBUG)
   printf("DEBUG mode is on.\n");
   #else
      printf("DEBUG mode is off.\n");
   #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
广告