c++ 前处理器# value的多重定义

fumotvh3  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在创建一个项目,我试图使一个新的语言制作宏。
一个名为X的宏有两种不同的用法:
1.要关闭一个带有括号的函数调用,如);},其中;结束代码行,}关闭代码块,
1.有时候我只想;}
总之,我需要做一个聪明的技巧,有时预处理器一行接一行地理解X需要是);};}
我可以用if else语句来实现它吗?或者以某种方式剥离所需的if
我尝试了一些条件值的实现,其中, ( condition ? state1 : state2 ),但这被翻译为来自preprocesor的字符串。
此外,我尝试从其他宏每次调用#undef X和重新定义X根据什么做我的行,等等。

pod7payv

pod7payv1#

预处理器还没有复杂到允许上下文相关的替换!预处理器对C语法一无所知,它实际上在C解析器之前运行。但是你需要你的预处理器“理解”你需要一个结束符号的地方,它不能做到这一点。
看看它的标准化方式,我认为这是故意的。
简而言之:你不能构建一个需要这个的DSL。老实说,现代C足够灵活,你可以在C本身中构建一个DSL,但你当然仍然会受到C的一般语法的约束。如果你需要其他东西,我会说C &标准预处理器可能不是你需要的工具。
话虽如此,如果您满足于将DSL放入像"…"这样的C字符串文字中,那么您可以使用constexpr解析来执行编译时DSL-这正是@vitaut的{fmt}在C中实现字符串格式化DSL的方式。

相关问题