有没有办法在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 ”是错误的。
有没有办法在代码中转义“高度”而不更改宏名称或将其字符串化?
答案 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