C語言預先處理功能——關於字串化和符號粘貼

來源:互聯網
上載者:User

在C語言開發中,宏定義是一個非常有用的工具,它可以使我們的代碼更容易理解,更容易維護。如查一個常量在多處被使用,且今後可能會根據不同需要而
修改的話,將其define一下那是再好不過了。除此之外,宏定義還有其他的功能,瞭解它,將更好地輔助我們開發C程式。先看個例子

#define Conn(x,y)   x##y  
#define ToString(x) #x
#define ToChar(x) #@x

這幾個宏定義中分別用到了“##”、“#”,“#@”它們的功能分別是:
1、粘接操作符##——串連兩個宏名,注意所串連的是宏名,而不是其所指代的值;
如int Conn(a,b);定義了一個int型變數ab,以後可以直接調用ab,而不必採用Conn(a,b)的形式;
printf(Conn("ab","cd"));輸出結果為:abcd
但是:

#define M 0  
#define var(x) Var_##x
...

int var(M);//此處定義了什嗎?

根據ANSI/ISO C,##操作符只是簡單地粘接兩個宏名,則int var(M)定義的應該就是Var_M,據測試,這一點是沒有問題的。但在一些比較古老的C編譯環境中,也有可能定義的是Var_0,比如在TC 2.0中測試發現“Var_0=0”可編譯通過,而“Var_M=0”出現ERROR。

2、字串化操作符#——將宏名轉化為字串

如printf(ToString(var1));輸出結果為:var1。var1可以是一個已定義的變數名,也可以是一個從未出現的字元組合
類似地,若有:

#define STR 0   
...

printf(Tostring(STR));//

當前流行編譯環境會輸出STR,而TC 2.0則會輸出0。

3、字元化操作#@——將宏名轉化為字元,注意:早期編譯器可能不支援
如:

char c;  

c = ToChar(1);//c = '1'
c = ToChar(a);//c = 'a'

如果提供的宏中不止一個字元(注意,不能超過4個,否則編譯器報錯),則轉化結果為最後一個字元,如

c = ToChar(abc);//c = 'c'  c = ToChar(abcd);//c= 'd'  c = ToChar(abcde);//ERROR 

總結一下,關於其用法是自己總結的,肯定不全。

1、使用中遵循ANSI C中規定,但要記得編譯通不過是可能是早期編譯器不支援C標準的問題;
2、##操作可應用在變數定義中,若程式開發中遇到要定義一大堆變數,且這些變數具有相同的首碼時,##很顯得尤為重要,它可以使代碼更加整潔,且減少了出錯的機率。如果一旦後來發現需要批量修改變數首碼,你會慶幸自己使用了這麼一件利器;
3、#操作符可用於調試時將變數名輸出,可配合##一起使用,如定義#define CHECK_VAR(x,fmt) printf(#x " = "
#fmt "\n", x),則CHECK_VAR(var1,%d)相當於printf("var = %d\n", var1);

Tips:
1、ANSI C中規定若宏定義名出現在引號(' '或" ")中,則不進行替換,但有些早期編譯器的處理可能有所不同,如#define CTRL(c) (‘c’ & 37),按照標準CTRL(d)被擴充成('c' & 37)。顯然,這沒有完成作者的本意,它在某些編譯器下碰巧能工作不過是個意外,實際使用中應避免。
2、字串的串連不必使用##這麼麻煩,實際中兩個字串常量可以直接寫到一起,如printf("ab""cd")輸出abcd。或在使
用##宏定義時,可以用printf(ToString(str)
"\n");輸出字串後換行,以前不敢這樣用,後來實驗了下發現還比較好使,當然直接用puts也可完成同樣功能。
3、若要使#或##轉換的是宏字元常量的值也不是其名字,可以使用間接方法,如:

#define ToString(x) #x  
#define Xstr(x) ToString(x)
#define STR1 STR2
...

printf(Xstr(STR1));//輸出結果是STR2而非STR1


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.