这不是我的确切问题,但一个例子如下
// 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和朋友。事实并非如此。
为什么?他们是绕道吗?
答案 0 :(得分:4)
不幸的是,没有办法解决这个问题。预处理器处理基本上涉及将宏替换为原始行,然后再次重新处理它。因此,如果您致电Function(x)
,它首先会变为(_SLA[x] + _OSLAN[x] * _WAMNSL[x])
,然后会替换_SLA
,_OSLAN
和_WAMNSL
宏。如果它们没有在发生这种替换的地方定义,它们将保持不变。
答案 1 :(得分:0)
除了发布的答案,您可以考虑将宏重写为:
#define Function(argument) \
( StupidLongArray[argument] \
+ OtherStupidLongArrayName[argument] \
* WhyAreMyNamesSoLong[argument] )
这比使用简短的无意义缩写的版本更清晰,更易于阅读。
也可以明智地交换外观顺序,以便在添加之前放置乘法运算,以使代码更易于阅读。
作为旁注,您应该避免使用以_
开头的标识符名称,因为它可能会与库标识符冲突。