C预处理器中#define是否继承先前定义?宏替换有效性咨询
关于C预处理器#define的两个问题解答
问题1:#define是否会引用先前已定义的#define?
是的,C预处理器在处理宏定义时,会自动引用并展开先前已定义的宏,前提是这些宏在当前宏定义之前已经被预处理程序处理完成。
需要注意例外情况:如果宏定义中出现自引用(比如#define A A+1),预处理器会避免无限递归展开,这种情况下自引用的标识符不会被替换。
问题2:示例宏的展开是否符合预期?
你的示例宏展开完全符合预期,具体过程如下:
- 首先
#define r 31定义了宏r,值为31。 - 处理
#define UMASK (0xffffffffUL<<r)时,预处理器会将宏体中的r替换为已定义的31,最终UMASK展开为(0xffffffffUL<<31),对应数值0x80000000UL。 - 处理
#define LMASK (0xffffffffUL ^ UMASK)时,预处理器会先展开UMASK为上面的结果,因此LMASK最终展开为(0xffffffffUL ^ (0xffffffffUL<<31)),计算后对应数值0x7fffffffUL。
所以你给出的代码:
uint32_t x = (state_array[k] & UMASK) | (state_array[j] & LMASK);
会被预处理器解析为:
uint32_t x = (state_array[k] & 0x80000000UL) | (state_array[j] & 0x7fffffffUL);
完全符合你的预期。
补充说明
C标准中明确规定了宏替换逻辑:当预处理器展开一个宏时,会先替换宏体中的所有标识符(如果该标识符是已定义的宏且不是当前宏的自引用),然后对替换后的文本再次扫描,直到没有可展开的宏为止。
内容的提问来源于stack exchange,提问作者robert bristow-johnson
相关产品推荐
相关产品推荐

