4

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

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

数字 100 和 200 在以后阅读代码时会让人感到困惑,所以我想为它们使用#define。但是这些定义只需要这个函数,我可以在函数内部定义它们吗?这种方式的优点是:

  • 这是非常本地化的价值观,没有人需要知道它
  • 离用处更近了,用意很明确,没有别的用处,它们就像局部变量(除了它们不是)

缺点可能是定义诸如局部变量/常量之类的东西的方法相当粗略,但显然不是局部的。

除此之外,在 C++ 函数中 #define 会很奇怪吗?大多数时候我们在文件顶部使用#defines。在替换像这样的固定本地硬编码值时,是否以任何方式更好地使用 const 变量?

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

4

2 回答 2

17

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

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

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

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

如果您确实有理由定义仅在本地使用的宏,#undef则可以在完成后使用它来摆脱它。但总的来说,当(像这里)有一个语言级别的结构可以满足您的需求时,您应该避免使用宏。

于 2013-10-10T18:08:59.190 回答
3

特别是在 C++ 中,看到用于该目的的宏会很奇怪。在 C++const中,完全替换了用于定义清单常量的宏。而且const效果更好。(在 C 语言中,您必须#define在许多(或大多数)情况下坚持使用,但您的问题被标记为 C++)。

话虽如此,伪本地宏有时在 C++ 中会派上用场(尤其是在 C++11 之前的语言版本中)。如果由于某种原因您必须在函数“内部”使用这样的宏,那么在同一范围的末尾#define显式地定义该宏是一个非常好的主意。#undef(我将单词 inside 括在引号中,因为预处理器并不真正关心范围,也无法区分“内部”和“外部”。)这样,您将能够模拟其他本地标识符所具有的范围可见性行为,而不是拥有一个“本地”定义的宏,一直溢出到代码的其余部分,直到翻译单元的末尾。

于 2013-10-10T18:13:51.763 回答