CPP:转义宏标识符

时间:2011-12-01 09:42:24

标签: c++ macros

有没有办法在c预处理器(cpp)中转义宏名称(标识符)?

我想用一些可读的宏名称条件化一些网页代码(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;
}

但“line- 480 ”是错误的。

有没有办法在代码中转义“高度”而不更改宏名称或将其字符串化?

2 个答案:

答案 0 :(得分:2)

你可以:

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

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

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

答案 1 :(得分:0)

我使用了Luchian Grigore的想法来取消定义使用过的文件名,我发现了一个(几乎)通用解决方案来解决这个问题:

在条件开头包含“define.file”,在给定条件后包含“undefine.file”。

因此问题被简化为两个宏名称,必须保留:DEFINEFILE和UNDEFINEFILE。但是这两个宏可以用哈希码或随机名加密,以避免在条件文本中使用这些名称。

“define.file”:

#define height 480
#define os 1

“undefine.file”

#undef height
#undef os

“conditionalcss.ccss”

/*root*/
some rootcode

#include __DEFINEFILENAMEPATH__

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

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

#endif

#if os==1
#include __UNDEFINEFILENAMEPATH__
os is windows (if 1 refers to windows)
and height also undefined i hope
#endif

最后使用参数化定义和取消定义文件的cppcall:

cpp -P -D __DEFINEFILENAMEPATH__="\"define.file\"" -D __UNDEFINEFILENAMEPATH__="\"undefine.file\"" -oout.css css.ccss

有了这个想法,恢复“out.css”看起来像:

some rootcode
.page {
    line-height:23px;
}
os is windows (if 1 refers to windows)
and height also undefined i hope

由于多次导入,此解决方案只有两个宏的缺点和可能的性能不佳。

我希望能帮助其他人解决问题。

格尔茨 Adreamus