2014-05-07 27 views
0

我今天在包含#define宏的C++文件中遇到了一個函數。
函數以return語句結尾,後面跟着一個#undef宏。
一個例子是...在C++中返回語句之後的undef宏

int test() { 
    #define STUFF()... 

    return 0; 
    #undef STUFF 
} 

這是好還是不好的做法,並沒有任何的優勢或劣勢來這樣做,還是在和#undef需要位於要確認的返回之前?

+2

這是一個預編譯指令。它在運行時被忽略。 –

回答

3

這樣做,這只是罰款,除此之外,宏的名稱可能發生衝突與另一個宏名稱。因此,您可以使用一個荒謬的短名稱,如'A'或可笑的長名稱,如'LIBRARY_LIBRARY_NAME_TEMPORARY_MACRO'

您應該在使用maco後立即放置#undef。

+0

我會爲更長的名字投票,以防其他人讀這個相同的建議。 :) – cHao

+0

@cHao短有一些魅力,(由於#undef) –

+1

我喜歡不得不輸入較少。 :)但是,如果兩個定義都不是「名稱空間」\ *,那麼可以踐踏現有的宏。 (\ *在命名約定意義上,不是C++的。) – cHao

0

我不會說#defined的功能內容類似於'最佳實踐'。由於@IanMedeiros已經表明它是一個預編譯器指令,這意味着編譯器在運行時已經被擴展。它很難理解原作者的想法,但我會考慮哪些文件更多的作者的東西,如推理更明確的辦法:

int test() { 
    #if defined(INCLUDE_STUFF) 
    Stuff() 
    #endif 
) 
1

#define和#undef是編譯器指令。它們是代碼預處理的一部分,並且獨立於它們與「真實」代碼關聯的位置而運行。

基本上,編譯運行的代碼之前,它通過每一個指令(的#include和#define的#ifdef)和預處理你的代碼,因此,舉例來說,當你這樣做:

int firstVariable = MY_DIRECTIVE; 
#define MY_DIRECTIVE 7 
int doesNothing = 9; 

int myVariable = MY_DIRECTIVE; 
#undef MY_DIRECTIVE 
int thirdVariable = MY_DIRECTIVE; 

其轉換它在:

int firstVariable = MY_DIRECTIVE; 

int doesNothing = 9; 

int myVariable = 7; 

int thirdVariable = MY_DIRECTIVE; 

,只有經過它會編譯你的代碼(在這種情況下,給你一個錯誤MY_DIRECTIVE尚未在第1行定義和7)

對於M礦石信息: Preprocessor directives (cplusplus)