C预处理宏中的正则表达式

8
我想知道编译器(GCC)预处理器中是否有任何正则表达式扩展。基本上是更灵活的代码生成宏。
如果没有这种方法,你建议我如何实现相同的结果。

如果您提供了实际问题的更多详细信息,有些人可能会知道解决方法。 - krs1
我有多种情况下会用到这样的东西。例如,将一堆枚举成员自动转换为一个switch语句,这样即使添加了一个成员,代码也会更新为默认实现或#error。如果你认为这是非常重要的信息,我可以把它放在问题中。 - Paulo Neves
@aiwarrior - 针对您上述的问题 - 您可以使用X-macro技巧来生成ENUM和SWITCH语句。此外,您还可以在这本e-book中了解有关x-macros的信息 - 第173页 - “预处理器的实际应用II:X Macro Trick”。 - Agnius Vasiliauskas
4个回答

5

C预处理器无法做到这一点。

您可能需要使用模板处理器(例如Mustache,但还有许多其他选择),在传递给编译器之前生成所需的内容。


这确实是我从未听说过的东西,看起来似乎会有很大帮助。我会等待更多答案,看是否有其他解决方案。 - Paulo Neves

1
此外,如果您正在计划一个更大的项目,并且您知道这个功能将会有益,那么您可能希望编写自己的预处理器,以便您可以从某些构建系统中自动运行它。这样的解决方案的一个很好的例子是moc,它为Qt框架增强了C++。当然,纯粹主义者可能会持不同意见。

我不是纯粹主义者,我不同意。qmake与Qt对C ++的预处理无关。这是moc!doc.qt.nokia.com/latest/moc.html - Gregory Pakosz
虽然我不同意 qmake 在语言本身方面的不透明方式,但这本身就是一个项目,而我不需要那么多的火力。 - Paulo Neves
当然我在想 moc..我的错!需要更多的睡眠。;-) - RushPL
Moc的链接已经失效。 - Foad S. Farimani

0

有一个 https://github.com/graph/qc QC = Quick C 工具,它允许你在以 qc.h 结尾的源代码文件中执行此操作。

$replace asdf_(\d+) => asdf_ :) $1 blabla

// and now in your code anything that matches the above regular expression
asdf_123
// will become asdf_ :) 123 blabla

它将输出一个经过预处理的 .cpp 和 .h 文件。它的设计是为了避免维护头文件的需要。还有一些其他的东西不兼容 C++,但它输出的是 C++ 代码,所以你可以在最后做你想做的所有 C++ 的事情。

编辑:我制作了它,并且有一个对 qc 的偏好。


0

您可能想要查看re2c.org。它是一种单独的C预处理器,用于生成匹配正则表达式的C代码。当我寻找类似内容时,我发现了这个网站和您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接