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

时间:2016-06-28 03:58:55

标签: c header 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和朋友。事实并非如此。

为什么?他们是绕道吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

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

也可以明智地交换外观顺序,以便在添加之前放置乘法运算,以使代码更易于阅读。

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