2012-12-14 112 views
2
gcc (GCC) 4.7.2 
c89 

你好,函數宏與宏

我一直在尋找一個測試套件,我注意到這個函數宏聲明如下:

#define MU_SUITE_START() char *msg = NULL 

然而,沒有任何真正的區別在做只是這個:

#define MU_SUITE_START char *msg = NULL 

宏只是做文本替換,所以我不認爲有將是任何性能問題。

使用CPP,我得到以下結果,因此這裏沒有什麼特別。

函數宏

char *msg = __null; 

馬爾科

char *msg = __null; 

只是一個側面說明:是不是值得聲明函數樣的馬可,不輸入參數提供? 在這裏我不傳遞任何參數 即

#define PRINT_MSG() printf("This is the message\n") 

爲什麼用函數宏打擾,如果沒有輸入參數,是不是這更好的?

#define PRINT_MSG printf("This is the message\n") 

非常感謝您的任何建議,

+4

部分是可讀性。如果它要表現得像一個函數,爲什麼不使它看起來像一個呢? – Mysticial

+0

如果你要有一個類似於函數的宏,那麼*請*將它包裝在一個'do-while(false)'中,所以我不能這樣做:'unsigned MU_SUITE_START()+ 10000;'實際上等待,在這裏不起作用。更好的建議:不要使用宏。 – Pubby

回答

5

有對象類和函數宏之間的一個區別:

#define OBJECT  char *msg1 = NULL 
#define FUNCTION() char *msg2 = NULL 

void somefunc(void) 
{ 
    int OBJECT = 5; 
    int FUNCTION = 10; 
    ... 
} 

OBJECT聲明由宏替換(所以代碼不會編譯),但對FUNCTION的引用不是宏調用,因爲它後面沒有左括號。

這是很少重要。但是,當它是真的很重要。

一個更典型的情況可能是,可以實現爲宏的功能。爲了討論的緣故(因爲它是很容易理解,而不是因爲它是一個很好的例子):

extern int isdigit(int c); 
#define isdigit(c) ((c) >= '0' && (c) <= '9') 

,並在實現文件:

int (isdigit)(int c) 
{ 
    assert((c >= 0 && c <= UCHAR_MAX) || c == EOF); 
    return isdigit(c); 
} 

忽略這樣的小細節也不怎麼isdigit()很可能會實現,並isdigit()宏實現不允許評估其參數不止一次了,你不應該重新定義的東西都是在標準C庫函數定義不是宏,因爲擴展名isdigit後面跟着(,但函數內部的宏被擴展了。至少該函數在宏,這幾乎保證了相同的行爲的條款執行。它

+1

我忽略了一些東西,還是你對'OBJECT'和'FUNCTION'的定義完全一樣? – Mysticial

+0

我錯過了一對括號......謝謝! –