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

时间:2016-12-04 14:50:40

标签: c macros

我想知道除了样式首选项之外还有另一个原因是定义和取消定义特定于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
}

VS

#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 :(得分:1)

不,除了风格选择之外没有任何理由。

预处理器不知道该功能,它不会在该级别解析C.

我说#undef:宏是很少见的,但当然可以更清楚地说明宏是本地的。

答案 1 :(得分: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