c – CPP:转义宏标识符

有没有办法逃避c预处理器(cpp)中的宏名称(标识符)?

我想条件化一些具有可读宏名称的Web代码(html,css …).

条件css文件的示例:

/*root*/
some rootcode

#if height==480
/* height 480 */
.page {
    line-height:23px;
}

#elif height<480
/* height < 480 */
.page {
    line-height:46px;
}

#endif

调用

cpp -P -D height=480 -oout.css css.ccss

结果(删除换行符后)

some rootcode
.page {
    line-480:23px;
}

但“480行”是错误的.

有没有办法逃避代码中的“高度”而不更改宏名称或字符串化?

最佳答案 你可以:

1)取消定义宏:

#undef height

2)使用类似标准的大写重命名宏:

#define HEIGHT

3)在处理文件之前使用警卫:

#if height==480
#define HEIGHT_480
#undef height
#endif

#if height>480
#define HEIGHT_OVER_480
#undef height
#endif

/*root*/
some rootcode

#if HEIGHT_480
/* height 480 */
.page {
    line-height:23px;
}

#elif HEIGHT_OVER_480
/* height < 480 */
.page {
    line-height:46px;
}

#endif

第一个在undefine之后丢失信息.如果广泛使用宏,第二个是不切实际的.

第三个是IMO的最佳选择.我已经看到它用在生产代码中,这样的东西是必要的.

点赞