例如巨集定義如下:
#define conn(x,y) x##y
#define tochar(x) #@x
#define tostring(x) #x
x##y表示什麼?表示x連線y,舉例說:
int n = conn(123,456); 結果就是n=123456;
char* str = conn("asdf", "adf")結果就是 str = "asdfadf";
對於#@x,其實就是給x加上單引號,結果返回是乙個const char。舉
例說:char a = tochar(1);結果就是a='1';
做個越界試驗char a = tochar(123);結果是a='3';
但是如果你的引數超過四個字元,編譯器就給給你報錯了!
error c2015: too many characters in constant :p
最後看看#x,估計你也明白了,他是給x加雙引號
char* str = tostring(123132);就成了str="123132";
# 和 ## 在巨集定義(define)中經常可以看到,是預編譯過程中的常用語句,本文記錄了本人探索 # 和 ## 區別以及使用的內容
先簡單的將這兩個符號進行標籤化,然後再記錄具體實驗。
# -- 轉換, 完成**到字串的轉換
## -- 連線, 完成**的連線
示例:1. # 轉換**為字串
#define convert(name) #name
int main(int argc, char* argv)
這裡, james 將在預編譯過程中被轉換為字串 "james" 。
2. ## **連線
#define cat(batman, robin) batman ## robin
#define make_friend(index) printf("you and %s are friends.\n", cat(james, index));
int main(int argc, char* argv)
首先,這裡仍需要將 001、007、110 看作是**,而不是數字。
然後再說,通過 cat 將 james 和 index 拼合成為 james001、james007、james110 三個變數(**),在 print 過程中列印出來。
後續:在其他文章裡,可能你還會找到 ## 可以拼接字串, # 也可以。但是實測結果是,在 linux 環境中,無法正常編譯。所以為了**的通用性,最好還是僅將 # 和 ## 作上述兩種用途。當然在這個基礎之上可以有很多的擴充套件。
C 中 ? 和 ? 和??用法
1.可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別通常不能表示為空。例如 string str null 是正確的,int i null 編譯器就會報錯。為了使值型別也可為空,就可以使用可空型別,即用可空型別修飾符 來表示,表現形式為 t?例如 int?表示可空的整形,datet...
java中 和 和 和 詳解
首先 和 都有短路的功能 表示and條件並列,而 表示或者的意思 如果第乙個條件為false後邊的條件 不執行了,如果第乙個條件為true那麼繼續執行第二個條件,第二個條件為false那麼結果為false。第乙個為true第二個為false那麼結果為false。都為true那麼結果也為true 不管...
C 中 和 和 代表什麼
代表可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別通常不能表示為空。為了使值型別也可為空,就可以使用可空型別 帶便三元表示式 int a b c?b c 如果b大於c,a就等於b,否則等於c 代表空合併運算子 用於定義可空型別和引用型別的預設值。如果此運算子的左運算元不為null...