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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C语言预处理功能——关于字符串化和符号粘贴

發(fā)布時間:2023/12/19 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言预处理功能——关于字符串化和符号粘贴 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

  • #define?M?0 ?
  • #define?var(x)?Var_##x ?
  • ... ?
  • ?
  • int?var(M);//此處定義了什么??

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

    2、字符串化操作符#——將宏名轉(zhuǎn)化為字符串

    如printf(ToString(var1));輸出結(jié)果為:var1。var1可以是一個已定義的變量名,也可以是一個從未出現(xiàn)的字符組合
    類似地,若有:
    ?

  • #define?STR?0? ?
  • ... ?
  • ?
  • printf(Tostring(STR));// ?
  • ?

    當前流行編譯環(huán)境會輸出STR,而TC 2.0則會輸出0。

    3、字符化操作#@——將宏名轉(zhuǎn)化為字符,注意:早期編譯器可能不支持
    如:
    ?

  • char?c; ?
  • ?
  • c?=?ToChar(1);//c?=?'1' ?
  • c?=?ToChar(a);//c?=?'a'?

  • 如果提供的宏中不止一個字符(注意,不能超過4個,否則編譯器報錯),則轉(zhuǎn)化結(jié)果為最后一個字符,如
    ?

  • c?=?ToChar(abc);//c?=?'c' ?
  • c?=?ToChar(abcd);//c=?'d' ?
  • c?=?ToChar(abcde);//ERROR?
  • 總結(jié)一下,關(guān)于其用法是自己總結(jié)的,肯定不全。


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

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

  • #define?ToString(x)?#x ?
  • #define?Xstr(x)?ToString(x) ?
  • #define?STR1?STR2 ?
  • ... ?
  • ?
  • printf(Xstr(STR1));//輸出結(jié)果是STR2而非STR1?
  • ?

    轉(zhuǎn)載于:https://blog.51cto.com/sunnylgz/628831

    總結(jié)

    以上是生活随笔為你收集整理的C语言预处理功能——关于字符串化和符号粘贴的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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