C C 關於 在巨集定義中的用法

2021-07-17 01:12:32 字數 1981 閱讀 6758

在c/c++的巨集定義中,#/##存在特殊的作用
1. #運算子將乙個巨集的引數轉換為字串字面量。它僅允許出現在帶引數的巨集的替換列表中。

[cpp]view plain

copy

#include 

#define print_str(s)      printf(#s" = %s/n", s)

intmain()   

輸出:
s1 = aaa

注:

printf(#s" = %s/n", s) -> printf(s1" = %s/n", s1) -> printf("s1 = %s/n", s1)->printf("s1 = %s/n", "aaa")

#s只是做巨集引數字面替換

s則仍然是乙個變數名

2.##運算子可以將兩個記號(例如識別符號)「粘」在一起,成為乙個記號。(無需驚訝,##運算子被稱為「記號粘合」。)

如果其中乙個運算元是巨集引數,「粘合」會在當形式引數被相應的實際引數替換後發生。

[cpp]view plain

copy

#include 

#define print_str(i)      printf("str = %s/n", s##i)

intmain()   

輸出:

str = s1

str = s2

str = s3

3.c99的複雜巨集:可變引數

[cpp]view plain

copy

#include 

#define print_str(format, ...)      dowhile(0)

intmain()   

輸出:

str1 is s1 

str2 is s2

but attention!

[cpp]view plain

copy

#include 

#define print_str(format, ...)      dowhile(0)

intmain()   

編譯:
macro1.cpp: in function 『int main()』:

macro1.cpp:8: error: expected primary-expression before 『)』 token

這裡提示錯誤,原因是少了變參列表,只有format引數,這裡在format引數後就多了乙個','。

so,gnu cpp想出了乙個特殊的##操作,沒錯,##操作又來了,但是不是上面的拼接行為了。

如果可變引數被忽略或為空,「##」操作將使預處理器去除掉它前面的那個逗號。

如果在巨集呼叫時,確實提供了一些可變引數,gnu cpp也會工作正常,它會把這些可變引數放到逗號的後面。

[cpp]view plain

copy

#include 

#define print_str(format, ...)      dowhile(0)

intmain()   

輸出:

str1 is over

關於 在巨集定義中的用法

在c c 的巨集定義中,存在特殊的作用1.運算子將乙個巨集的引數轉換為字串字面量。它僅允許出現在帶引數的巨集的替換列表中。view plain copy to clipboard print?include define print str s printf s s n s int main 輸出 ...

關於巨集定義中 與 的用法

巨集在條件編譯以及各種大規模的定義裡是非常有用的。前面qt原始碼學習筆記裡就有一篇用來介紹巨集的定義。這次主要介紹下巨集定義裡 的作用。關於巨集,注意可以用gcc e test.cpp來檢視預編譯之後的結果。1.先介紹 主要是字串替換的作用。將傳入的符號轉化為字串 直接上源 define marco...

關於巨集定義的用法

如何解釋下面這段 define led1 a if a gpio setbits gpioc,gpio pin 3 else gpio resetbits gpioc,gpio pin 3 首先,這個是用巨集定義的方式包裝成類似函式那樣,但不是函式呼叫 你在 中呼叫 led1 1 實際上通過巨集定義...