日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

define宏定义中的#,##,@#及\符号

發(fā)布時(shí)間:2025/4/9 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 define宏定义中的#,##,@#及\符号 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

define宏定義中的###@#\符號(hào)

#define中,標(biāo)準(zhǔn)只定義了###兩種操作。#用來(lái)把參數(shù)轉(zhuǎn)換成字符串,##則用來(lái)連接兩個(gè)前后兩個(gè)參數(shù),把它們變成一個(gè)字符串。?

1#?stringizing)字符串化操作符。其作用是:將宏定義中的傳入?yún)?shù)名轉(zhuǎn)換成用一對(duì)雙引號(hào)括起來(lái)參數(shù)名字符串。其只能用于有傳入?yún)?shù)的宏定義中,且必須置于宏定義體中的參數(shù)名前。

如:

#define?example(instr)?printf("the?input?string?is:\t%s\n",#instr)

#define?example1(instr)?#instr

當(dāng)使用該宏定義時(shí):

example(abc);?在編譯時(shí)將會(huì)展開(kāi)成:printf("the?input?string?is:\t%s\n","abc");

string?str=example1(abc);?將會(huì)展成:string?str="abc"

注意:

對(duì)空格的處理

a。忽略傳入?yún)?shù)名前面和后面的空格。

???如:str=example1(???abc?);?將會(huì)被擴(kuò)展成?str="abc"

b.當(dāng)傳入?yún)?shù)名間存在空格時(shí),編譯器將會(huì)自動(dòng)連接各個(gè)子字符串,用每個(gè)子字符串中只以一個(gè)空格連接,忽略其中多余一個(gè)的空格。

???如:str=exapme(?abc????def);?將會(huì)被擴(kuò)展成?str="abc?def"

?

2##?token-pasting)符號(hào)連接操作符

宏定義中:參數(shù)名,即為形參,如#define?sum(a,b)?(a+b);中ab均為某一參數(shù)的代表符號(hào),即形式參數(shù)。

##的作用則是將宏定義的多個(gè)形參成一個(gè)實(shí)際參數(shù)名。

如:

#define?exampleNum(n)?num##n

int?num9=9;

使用:

int?num=exampleNum(9);?將會(huì)擴(kuò)展成?int?num=num9;

注意:

1.當(dāng)用##連接形參時(shí),##前后的空格可有可無(wú)。

如:#define?exampleNum(n)?num?##?n?相當(dāng)于?#define?exampleNum(n)?num##n

2.連接后的實(shí)際參數(shù)名,必須為實(shí)際存在的參數(shù)名或是編譯器已知的宏定義

?

//?preprocessor_token_pasting.cpp

#include?<stdio.h>

#define?paster(?n?)?printf_s(?"token"?#n?"?=?%d",?token##n?)

int?token9?=?9;

?

int?main()

{

???paster(9);

}

運(yùn)行結(jié)果:

token9?=?9

?

3@#?charizing)字符化操作符。

只能用于有傳入?yún)?shù)的宏定義中,且必須置于宏定義體中的參數(shù)名前。作用是將傳的單字符參數(shù)名轉(zhuǎn)換成字符,以一對(duì)單引用括起來(lái)。

#define?makechar(x)??#@x

a?=?makechar(b);

展開(kāi)后變成了:

a=?'b';

?

4\?行繼續(xù)操作符

當(dāng)定義的宏不能用一行表達(dá)完整時(shí),可以用"\"表示下一行繼續(xù)此宏的定義。

注意:換行不能切斷單詞,只能在空格的地方進(jìn)行。

?

?

?

宏定義的特殊符號(hào)#?##?-?[C++]

?

1.?利用宏參數(shù)創(chuàng)建字符串:#?運(yùn)算符
?
????在類(lèi)函數(shù)宏(function-like?macro)的替換部分中,“#”符號(hào)用作一個(gè)預(yù)處理運(yùn)算符,它可以把語(yǔ)言符號(hào)(token)轉(zhuǎn)化為字符串。例如,如果?x?是一個(gè)宏參量,那么?#x?可以把參數(shù)名轉(zhuǎn)化為相應(yīng)的字符串。該過(guò)程稱為字符串化。
?
????說(shuō)明:類(lèi)函數(shù)宏就是帶參數(shù)的宏。類(lèi)函數(shù)宏的定義中,用圓括號(hào)括起來(lái)一個(gè)或多個(gè)參數(shù),隨后這些參數(shù)出現(xiàn)在替換部分。
#include?<stdio.h>????
#define?PSQR(x)?printf("The?square?of?"?#x?"?is?%d.?\r\n",?(x)?*?(x))????
????
int?main(void)???
{???
????int?y?=?5;????
???????
????PSQR(y);???
????PSQR(2?+?4);????
????
????return?0;????
}???
????
//?輸出:???
The?square?of?y?is?25.?????//?用?"y"?代替?#x????
The?square?of?2?+?4?is?36.?//?用?"2?+?4"?代替?#x??
#include?<stdio.h>?
#define?PSQR(x)?printf("The?square?of?"?#x?"?is?%d.?\r\n",?(x)?*?(x))?
?
int?main(void)
{
????int?y?=?5;?
????
????PSQR(y);
????PSQR(2?+?4);?
?
????return?0;?
}
?
//?輸出:
The?square?of?y?is?25.?????//?用?"y"?代替?#x?
The?square?of?2?+?4?is?36.?//?用?"2?+?4"?代替?#x
#define?STRING2(x)?#x???
#define?STRING(x)?STRING2(x)???
????
#define?WQ?wangqi????
????
#pragma?message(STRING2(WQ))?//?WQ(字符串)???
#pragma?message(STRING(WQ))??//?wangqi(字符串)??
#define?STRING2(x)?#x
#define?STRING(x)?STRING2(x)
?
#define?WQ?wangqi?
?
#pragma?message(STRING2(WQ))?//?WQ(字符串)
#pragma?message(STRING(WQ))??//?wangqi(字符串)?
2.?預(yù)處理器的粘合劑:##?運(yùn)算符
?
????和?#?運(yùn)算符一樣,##?運(yùn)算符可以用于類(lèi)函數(shù)宏的替換部分。另外,##?運(yùn)算符還可用于類(lèi)對(duì)象宏(object-like?macro)的替換部分。這個(gè)運(yùn)算符把兩個(gè)語(yǔ)言符號(hào)組合成單個(gè)語(yǔ)言符號(hào)。例如,可以定義如下宏:
#define?XNAME(n)?x?##?n??
#define?XNAME(n)?x?##?n
????宏調(diào)用?XNAME(4)?會(huì)展開(kāi)成?x4?
?
????說(shuō)明:類(lèi)對(duì)象宏就是用來(lái)代表值的宏。如,#define?PI?3.141593?中的PI
#include?<stdio.h>????
#define?XNAME(n)?x?##?n????
#define?PRINT_XN(n)?printf("x"?#n?"?=?%d\r\n",?x?##?n);????
????
int?main(void)???
{???
????int?XNAME(1)?=?14;?//?變?yōu)?int?x1?=?14;????
????int?XNAME(2)?=?20;?//?變?yōu)?int?x2?=?20;????
????PRINT_XN(1)????????//?變?yōu)?printf("x1?=?%d\r\n",?x1);????
????PRINT_XN(2)????????//?變?yōu)?printf("x2?=?%d\r\n",?x2);????
????
????return?0;????
}???
????
//?輸出:???
x1?=?14????
x2?=?20???
#include?<stdio.h>?
#define?XNAME(n)?x?##?n?
#define?PRINT_XN(n)?printf("x"?#n?"?=?%d\r\n",?x?##?n);?
?
int?main(void)
{
????int?XNAME(1)?=?14;?//?變?yōu)?int?x1?=?14;?
????int?XNAME(2)?=?20;?//?變?yōu)?int?x2?=?20;?
????PRINT_XN(1)????????//?變?yōu)?printf("x1?=?%d\r\n",?x1);?
????PRINT_XN(2)????????//?變?yōu)?printf("x2?=?%d\r\n",?x2);?
?
????return?0;?
}
?
//?輸出:
x1?=?14?
x2?=?20?
#define?__T(x)??????L?##?x???
#define?_T(x)???????__T(x)???
#define?_TEXT(x)????__T(x)???
????????
#define?WQ?"wangqi"????
????????
#pragma?message(__T(WQ))?//?LWQ?(標(biāo)識(shí)符)???
wcout?<<?_T(WQ);?????????//?wangqi(寬字節(jié)字符串)??
#define?__T(x)??????L?##?x
#define?_T(x)???????__T(x)
#define?_TEXT(x)????__T(x)
?????
#define?WQ?"wangqi"?
?????
#pragma?message(__T(WQ))?//?LWQ?(標(biāo)識(shí)符)
wcout?<<?_T(WQ);?????????//?wangqi(寬字節(jié)字符串)?
3.?語(yǔ)言符號(hào)?
?
????從技術(shù)方面看,系統(tǒng)把宏的主體當(dāng)作語(yǔ)言符號(hào)(token)類(lèi)型字符串,而不是字符型字符串。C?預(yù)處理器中的語(yǔ)言符號(hào)是宏定義主體中的單獨(dú)的詞(word。用空白字符把這些詞分開(kāi)。例如:
#define?FOUR?2*2??
#define?FOUR?2*2
????這個(gè)定義中有一個(gè)語(yǔ)言符號(hào):即序列?2*2?。但是:
#define?SIX?2?*?3??
#define?SIX?2?*?3
????這個(gè)定義中有三個(gè)語(yǔ)言符號(hào):2*?和?3?
?
????在處理主體中的多個(gè)空格時(shí),字符型字符串和語(yǔ)言符號(hào)型字符串采用不同方法。考慮下面的定義:
#define?EIGHT?4????*????8??
#define?EIGHT?4????*????8
????把主體解釋為字符型字符串時(shí),預(yù)處理器用?4????*????8?替換?EIGHT?。也就是說(shuō),額外的空格也當(dāng)作替換文本的一部分。但是,當(dāng)把主體解釋為語(yǔ)言符號(hào)類(lèi)型時(shí),預(yù)處理器用由單個(gè)空格分隔的三個(gè)語(yǔ)言符號(hào),即?4?*?8?來(lái)替換?EIGHT?。?換句話說(shuō),用字符型字符串的觀點(diǎn)看,空格也是主體的一部分;而用語(yǔ)言符號(hào)字符串的觀點(diǎn)看,空格只是分隔主體中語(yǔ)言符號(hào)的符號(hào)。在實(shí)際應(yīng)用中,有些?C?編譯器把宏主體當(dāng)作字符串而非語(yǔ)言符號(hào)。在比這個(gè)實(shí)例更復(fù)雜的情況下,字符與語(yǔ)言符號(hào)之間的差異才有實(shí)際意義。
?
????順便提一下,C?編譯器處理語(yǔ)言符號(hào)的方式比預(yù)處理器的處理方式更加復(fù)雜。編譯器能理解?C?的規(guī)則,不需要用空格來(lái)分隔語(yǔ)言符號(hào)。例如,C?編譯器把?2*2?當(dāng)作三個(gè)語(yǔ)言符號(hào)。原因是?C?編譯器認(rèn)為每個(gè)?2?都是一個(gè)常量,而?*?是一個(gè)運(yùn)算符。
?

轉(zhuǎn)載于:https://www.cnblogs.com/TTTTT/p/3701871.html

總結(jié)

以上是生活随笔為你收集整理的define宏定义中的#,##,@#及\符号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。