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
廣告