2016-12-04 68 views
0

我想知道除了樣式偏好之外是否還有另一個原因來定義和取消定義C函數範圍內函數的特定宏。是否應該在函數的範圍中定義和取消定義特定於函數的C宏?

例如:

static float pay(float hours) 
{ 
    #define REG_PAY_HOURS 40.0 
    #define REG_PAY_RATE 15.0 
    #define OT_PAY_RATE (1.5 * PAY_RATE) 

    if(REG_PAY_HOURS >= hours) 
    { 
     return(hours * REG_PAY_RATE); 
    } 
    else 
    { 
     return((REG_PAY_HOURS * REG_PAY_RATE) + ((hours - REG_PAY_HOURS) * OT_PAY_RATE)); 
    } 

    #undef OT_PAY_RATE 
    #undef REG_PAY_RATE 
    #undef REG_PAY_HOURS 
} 

#define REG_PAY_HOURS 40.0 
#define REG_PAY_RATE 15.0 
#define OT_PAY_RATE (1.5 * PAY_RATE) 
static float pay(float hours) 
{ 
    if(REG_PAY_HOURS >= hours) 
    { 
     return(hours * REG_PAY_RATE); 
    } 
    else 
    { 
     return((REG_PAY_HOURS * REG_PAY_RATE) + ((hours - REG_PAY_HOURS) * OT_PAY_RATE)); 
    } 
} 
#undef OT_PAY_RATE 
#undef REG_PAY_RATE 
#undef REG_PAY_HOURS 

感謝

+2

預處理程序沒有範圍。這是同一件事。 –

+0

一些編碼標準,例如谷歌編碼標準,建議這樣做以避免碰撞。我認爲這取決於使用情況:如果您希望這些宏是可配置的參數,那麼將它們移動到文件頂部會更方便。 – user3528438

+0

對「PAY_RATE」的引用實際上應該是「REG_PAY_RATE」嗎? –

回答

1

沒有,有不同的風格上的選擇沒有理由。

預處理程序不知道該函數,它不解析該級別的C。

我想說#undef:ing宏是一種罕見的,但它當然可以是一個好主意,使它更清楚,宏是爲了本地。

1

爲您的使用情況下,這將是最好使用常量而不是宏,即

const float REG_PAY_HOURS = 40.0f; 
const float REG_PAY_RATE = 15.0f; 
const float OT_PAY_RATE = 1.5f * PAY_RATE; 

優點是更好的類型安全和遺忘括號危險較小。任何合理的編譯器應該能夠將這些值與宏常量一樣優化(或更好)。另外,如果你在一個函數內部聲明瞭你的常量,那麼它們就是它們可以訪問的地方,並且之後不需要#undef