【发布时间】:2019-10-01 16:52:20
【问题描述】:
我想知道是否存在编写预处理器宏的模式可以有效地“跳过”预扫描宏扩展。
#include <stdio.h>
#define SHIFT(label) label##_SHIFT
#define WIDTH(label) label##_WIDTH
#define MSB(label) label##_SHIFT + label##_WIDTH
#define A_SHIFT 0
#define A_WIDTH 4
#if 1
#define B_SHIFT 4
#else
/* Something like this would be preferred over, say
* #define B_SHIFT A_SHIFT + A_WIDTH
*/
#define B_SHIFT MSB(A)
#endif
#define B_WIDTH 4
int main(int argv, char ** argc) {
(void)argv;
(void)argc;
(void)printf("A: Width %d\n", WIDTH(A));
(void)printf("A: Shift %d\n", SHIFT(A));
(void)printf("A: MSB %d\n", MSB(A));
(void)printf("B: Width %d\n", WIDTH(B));
(void)printf("B: Shift %d\n", SHIFT(B));
(void)printf("B: MSB %d\n", MSB(B));
return 0;
}
在上面的人为示例中,如果使用B_SHIFT 宏的第二种形式,预处理器第一次扫描中的宏定义想要扩展A,(当然)它不能。
是否可以使用一些预处理器技巧,以便它可以有效地执行第二种形式?
【问题讨论】:
标签: macros c-preprocessor