我正在创建一个项目,我试图使一个新的语言制作宏。
一个名为X
的宏有两种不同的用法:
1.要关闭一个带有括号的函数调用,如);}
,其中;
结束代码行,}
关闭代码块,
1.有时候我只想;}
总之,我需要做一个聪明的技巧,有时预处理器一行接一行地理解X
需要是);}
或;}
。
我可以用if else
语句来实现它吗?或者以某种方式剥离所需的if
?
我尝试了一些条件值的实现,其中, ( condition ? state1 : state2 )
,但这被翻译为来自preprocesor的字符串。
此外,我尝试从其他宏每次调用#undef X
和重新定义X
根据什么做我的行,等等。
1条答案
按热度按时间pod7payv1#
预处理器还没有复杂到允许上下文相关的替换!预处理器对C语法一无所知,它实际上在C解析器之前运行。但是你需要你的预处理器“理解”你需要一个结束符号的地方,它不能做到这一点。
看看它的标准化方式,我认为这是故意的。
简而言之:你不能构建一个需要这个的DSL。老实说,现代C足够灵活,你可以在C本身中构建一个DSL,但你当然仍然会受到C的一般语法的约束。如果你需要其他东西,我会说C &标准预处理器可能不是你需要的工具。
话虽如此,如果您满足于将DSL放入像
"…"
这样的C字符串文字中,那么您可以使用constexpr
解析来执行编译时DSL-这正是@vitaut的{fmt}
在C中实现字符串格式化DSL的方式。