是否应该在函数的范围中定义和取消定义特定于函数的C宏?

问题描述:

我想知道除了样式偏好之外是否还有另一个原因来定义和取消定义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”吗? –

没有,有不同的风格上的选择没有理由。

预处理程序不知道该函数,它不解析该级别的C。

我想说#undef:ing宏是一种罕见的,但它当然可以是一个好主意,使它更清楚,宏是为了本地。

为您的使用情况下,这将是最好使用常量而不是宏,即

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

优点是更好的类型安全和遗忘括号危险较小。任何合理的编译器应该能够将这些值与宏常量一样优化(或更好)。另外,如果你在一个函数内部声明了你的常量,那么它们就是它们可以访问的地方,并且之后不需要#undef