C 中的 運算子和 VA ARGS

2021-10-06 18:48:04 字數 1318 閱讀 9839

#:構串操作符

1、構串操作符#只能修飾帶引數的巨集的形參,它將實參的字串行(而不是實參代表的值)轉換成字串常量 

#define string(x)  #x#x#x

#define text(x) "class"#x"info"

//巨集引用:

int abc = 100;

string(abc);

text(abc);

//替換結果:

abcabcabc

classabcinfo

2、也可通過#來獲取變數的名字(也是通過轉化為字串常量)

##:合併操作符

合併操作符##將出現在其左右的字串行合併成乙個新的識別符號

注意: 

使用合併操作符##時,自身的識別符號必須預先有定義,否則編譯器會報「識別符號未定義」的編譯錯誤。 

字串行合併成新的識別符號不是字串

#define class_name(name) class##name

#define merge(x,y) x##y##x

//巨集引用:

class_name(timer)

merge(me,to)

//替換結果:

classtimer

metome

__va_args__:

是乙個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。

實現思想就是巨集定義中引數列表的最後乙個引數為省略號(也就是三個點)。

#define my_print1(...)  printf(__va_args__)                               my_print1("i=%d,j=%d\n",i,j)  正確列印

#define my_print2(fmt,...)  printf(fmt,__va_args__)                   my_print1("i=%d,j=%d\n",i,j) 正確列印

##__va_args__:巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的","去掉的作用,否則會編譯出錯

一般這個用在除錯資訊上多一點

C 中 運算子 和 運算子

運算子定義在將可空型別分配給非可空型別時返回的預設值。int?c null 若 c 為 null,則 d 為 1,否則把 c 值賦予 d int d c 1 型別名稱後加問號,如 int?i null double?d null bool?b null 可指定可為 null 的 int double...

C 中的 和 運算子

和 運算子 構串操作符 構串操作符 只能修飾帶引數的巨集的形參,它將實參的字串行 而不是實參代表的值 轉換成字串常量 define string x x x x define text x class x info 巨集引用 int abc 100 string abc text abc 替換結果 ...

C 中的is和as運算子

is運算子 有些型別之間的轉換並不是能夠轉換成功,強制的轉換反而會丟擲一些異常,那麼,可以使用is運算子來檢查轉換是否可以轉換成功。is的語法如下 variable is newtype 如果variable可以通過引用轉換 裝箱轉換和拆箱轉換的方式轉換為newtype,那麼運算子返回true。舉例...