取消定义在另一个预处理器指令中使用的预处理器指令

Undefine a preprocesser directive that is used in another preprocessor directive

这不是我的确切问题,但示例如下

// Method 1

#define Function(argument)  (StupidLongArray[argument] + OtherStupidLongArrayName[argument] * WhyAreMyNamesSoLong[argument])

或者,首选

// Method 2

#define _SLA StupidLongArray
#define _OSLAN OtherStupidLongArrayName
#define _WAMNSL WhyAreMyNamesSoLong

#define Function(argument) (_SLA[argument] + _OSLAN[argument] * _WAMNSL[argument])

#undef _SLA 
...
...

我对这些预处理器方向的理解意味着一旦定义了 Function,我就可以摆脱 _SLA 和朋友。事实并非如此。

怎么会?他们有解决办法吗?

不幸的是,没有办法解决这个问题。预处理程序处理基本上涉及将宏替换到原始行中,然后再次重新处理。因此,如果您调用 Function(x),它首先变为 (_SLA[x] + _OSLAN[x] * _WAMNSL[x]),然后 _SLA_OSLAN_WAMNSL 宏随后被替换。如果它们没有在发生这种替换的地方定义,它们将保持原样。

除了已发布的答案外,您还可以考虑将宏重写为:

#define Function(argument)                     \
  ( StupidLongArray[argument]                  \
    + OtherStupidLongArrayName[argument]       \
    * WhyAreMyNamesSoLong[argument] )

这比您使用简短、无意义的缩写的版本更清晰易读。

交换出现的顺序可能也是明智的,这样乘法运算放在加法之前,使代码更容易阅读。

作为旁注,您应该避免提供以 _ 开头的标识符名称,因为这可能会与库标识符冲突。