C++宏

來源:互聯網
上載者:User

關於#和##在C語言的宏中,#的功能是將其後面的宏參數進行字串化操作(Stringfication),簡單說就是在對它所引用的宏變數通過替換後在其左右各加上一個雙引號。比如下面代碼中的宏:

#define WARN_IF(EXP)     \
     do{ if (EXP)     \
             fprintf(stderr, "Warning: " #EXP "\n"); }    \
     while(0)

那麼實際使用中會出現下面所示的替換過程:

WARN_IF (divider == 0);

被替換為

do {
     if (divider == 0)
fprintf(stderr, "Warning" "divider == 0" "\n");
} while(0);

這樣每次divider(除數)為0的時候便會在標準錯誤流上輸出一個提示資訊。

而##被稱為串連符(concatenator),用來將兩個Token串連為一個Token。注意這裡串連的對象是Token就行,而不一定是宏的變數。比如你要做一個功能表項目命令名和函數指標組成的結構體的數組,並且希望在函數名和功能表項目命令名之間有直觀的、名字上的關係。那麼下面的代碼就非常實用:

struct command
{
char * name;
void (*function) (void);
};

#define COMMAND(NAME) { NAME, NAME ## _command }

// 然後你就用一些預先定義好的命令來方便的初始化一個command結構的數組了:

struct command commands[] = {
COMMAND(quit),
COMMAND(help),
...
}

COMMAND宏在這裡充當一個代碼產生器的作用,這樣可以在一定程度上減少代碼密度,間接地也可以減少不留心所造成的錯誤。我們還可以n個##符號串連 n+1個Token,這個特性也是#符號所不具備的。比如:

#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
// 這裡這個語句將展開為:
// typedef struct _record_type name_company_position_salary;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.