取消定义在另一个预处理器指令中使用的预处理器指令
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] )
这比您使用简短、无意义的缩写的版本更清晰易读。
交换出现的顺序可能也是明智的,这样乘法运算放在加法之前,使代码更容易阅读。
作为旁注,您应该避免提供以 _
开头的标识符名称,因为这可能会与库标识符冲突。
这不是我的确切问题,但示例如下
// 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] )
这比您使用简短、无意义的缩写的版本更清晰易读。
交换出现的顺序可能也是明智的,这样乘法运算放在加法之前,使代码更容易阅读。
作为旁注,您应该避免提供以 _
开头的标识符名称,因为这可能会与库标识符冲突。