我的小C ++函数需要计算一个简单的超时值。
CalcTimeout(const mystruct st)
{
return (st.x + 100) * st.y + 200;
}
数字100和200会让以后读取代码变得混乱,所以我想对它们使用#define。但是这些定义只是仅用于此函数,我可以在函数内定义它们吗?这种方式的优点是:
缺点可能是定义类似局部变量/ const的粗略方法,但显然不是本地的。
除此之外,在C ++函数中#define是否奇怪?大多数情况下,我们在文件顶部使用#defines。是否更好地使用const变量来替换像这样的固定本地硬编码值?
目标实际上是使代码更具可读性/可理解性。
答案 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
是一个非常好的主意。 (我在引号中包含了单词,因为预处理器并不真正关心范围,并且不能告诉"内部"来自"外部"。)这样你就可以模拟其他本地标识符具有范围的可见性行为,而不是本地"将定义的宏扩展到代码的其余部分,一直到翻译单元的末尾。