在C ++函数中#define会不会很奇怪?

时间:2013-10-10 18:05:10

标签: c++ coding-style c-preprocessor

我的小C ++函数需要计算一个简单的超时值。

CalcTimeout(const mystruct st)
{
    return (st.x + 100) * st.y + 200;
}

数字100和200会让以后读取代码变得混乱,所以我想对它们使用#define。但是这些定义只是仅用于此函数,我可以在函数内定义它们吗?这种方式的优点是:

  • 这是非常本地的价值观,没有其他人需要了解它
  • 越接近使用它的地方,意图很明确,它没有其他用途,它们就像局部变量(除了它们不是)

缺点可能是定义类似局部变量/ const的粗略方法,但显然不是本地的。

除此之外,在C ++函数中#define是否奇怪?大多数情况下,我们在文件顶部使用#defines。是否更好地使用const变量来替换像这样的固定本地硬编码值?

目标实际上是使代码更具可读性/可理解性。

2 个答案:

答案 0 :(得分:17)

不要使用宏来定义常量;使用常数。

const int thingy = 100;  // Obviously, you'll choose a better name
const int doodad = 200;

return (st.x + thingy) * st.y + doodad;

与扩展为常量表达式的宏类似,可以将它们视为编译时常量。与宏不同,它们在函数中适当地限定范围。

如果您确实有理由定义仅在本地使用的宏,则可以使用#undef在您完成后删除它。但总的来说,你应该避免使用宏(就像这里一样),这是一个符合你想要的语言级结构。

答案 1 :(得分:3)

在C ++中,特别是看到宏用于此目的会相当奇怪。在C ++中const完全替换用于定义清单常量的宏。 const效果更好。 (在C中,您必须在许多(或大多数)案例中坚持#define,但您的问题标记为C ++。)

话虽如此,伪局部宏有时在C ++中派上用场(特别是在该语言的前C ++ 11版本中)。如果由于某种原因你必须#define这样的宏"内部"一个函数,在同一范围的末尾为该宏做一个显式#undef是一个非常好的主意。 (我在引号中包含了单词,因为预处理器并不真正关心范围,并且不能告诉"内部"来自"外部"。)这样你就可以模拟其他本地标识符具有范围的可见性行为,而不是本地"将定义的宏扩展到代码的其余部分,一直到翻译单元的末尾。