2013-08-23 78 views
1

我需要用C編寫一個宏,而不是一個函數的C函數宏

的功能如下:

void FSTATUS(int stat,char msg[]) 
{ 
    if(stat != 0) 
    { 
     EMH_ask_error_text(stat, &msg); 
     printf("Error : \"%d\",\"%s\"\n",stat,msg); 
    } 
    else 
     printf("\n -------- %s -------- \n",msg); 
} 

,因爲有可如何if語句中使用非常少的例子宏,我堅持這部分,我無法弄清楚如何將其轉換爲宏。任何人都可以請幫我拿出上面的代碼。

解決方案:

我用來代替宏

+0

是什麼讓你覺得這需要一個宏? –

+0

我需要將它稱爲宏來減少編譯時間 – Neal

+5

哦,您不會減少編譯時間,如果您使用宏,則可以增加編譯時間。請記住,在編譯之前,宏正在擴展到源代碼中。 –

回答

4

正確的格式的內聯函數,使一個巨大的差異,我相信。這就是爲什麼我總是對齊\的原因。

#define FSTATUS(stat, msg)        \ 
do              \ 
{               \ 
    if ((stat) != 0)          \ 
    {              \ 
     EMH_ask_error_text((stat), &(msg));    \ 
     printf("Error : \"%d\",\"%s\"\n", (stat), (msg)); \ 
    }              \ 
    else             \ 
    {              \ 
     printf("\n -------- %s -------- \n", (msg));  \ 
    }              \ 
}               \ 
while (0) 

要點:確保有在線條的末端\後面沒有空格。白色空間「打破」了換行符。

當然,你也可以這樣做:

#define FSTATUS(s, m) ((s) ? (EMH_ask_error_text((s), &(m)), printf("Error : \"%d\",\"%s\"\n", (s), (m))) : printf("\n -------- %s -------- \n", (m))) 

這裏逗號運算符是用來作爲if - 阻塞兩種說法之間的分隔符。

5
#define FSTATUS(stat, msg) do \ 
{ \ 
    if((stat) != 0) \ 
    { \ 
     EMH_ask_error_text(stat, &(msg)); \ 
     printf("Error : \"%d\",\"%s\"\n",stat,msg); \ 
    } \ 
    else \ 
     printf("\n -------- %s -------- \n",msg); \ 
} while (0) 

注意使用do { ... } while (0)確保這一工作正常if/else之間。

還請注意在某些地方使用附加的括號以避免statmsg是表達式時出現的問題。

當然要非常瞭解宏的所有缺陷 - 除非有很好的理由,否則不應該使用這種類型的函數宏。理想情況下,如果性能確實很重要,則應該使用內聯函數,否則只需使用正常函數即可。

+1

很好的訣竅(0):)。 –

+0

感謝您的答案..我傳遞的參數是int stat和char msg [],即一個數組..所以我怎麼傳遞一個數組? – Neal

+0

我試過了#define FSTATUS(int stat,char [] msg),但是它顯示了一個語法錯誤 – Neal