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

zar*_*zar 4 c++ coding-style c-preprocessor

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

CalcTimeout(const mystruct st)
{
    return (st.x + 100) * st.y + 200;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

目标实际上是使代码更易读/可理解.

Mik*_*our 17

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

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

return (st.x + thingy) * st.y + doodad;
Run Code Online (Sandbox Code Playgroud)

就像扩展为常量表达式的宏一样,这些宏可以被视为编译时常量.与宏不同,这些宏在函数中适当地限定范围.

如果你确实有理由定义一个仅在本地使用的宏,那么你可以使用#undef它来完成它后去除它.但总的来说,你应该避免使用宏(就像这里一样)有一个语言级别的构造可以做你想要的.

  • 此外,任何体面的编译器都会将它们优化到与文字常量相同的程度; 他们不会占用任何额外的空间或时间.另外你可以进行型式检查.因此`const`对象比`#define`宏有更多的好处,而且没有更多的成本. (5认同)