我继承了一些 PCL(Patran 命令语言)代码,这些代码使用 C 预处理器进行预处理以启用宏等。此代码具有许多不适用于现代预处理器(例如 cpp)的功能。
比如一个issue是因为`//'在PCL中是concatenate操作符,却被cpp识别为注释:
$ A.pcc
#define FUNC(X) ui_write(X)
string variable
FUNC("text "//variable//" more text")
要求的结果是
ui_write("text "//variable//" more text")
我可以用命令成功地预处理它
cpp -traditional A.pcc
在哪里
-traditional
说使用不标记化的旧式cpp,所以评论符号不是问题。如果不使用此标志,预处理器将无法匹配 X
中的参数 FUNC(X)
并在注释处结束令牌搜索时出错。
在同一个文件(以及许多其他文件)中也使用了标记连接/标记粘贴:
$ B.pcc
#define CAT(I,J) command ## I ## J ## ()
CAT(1,2)
要求的结果是
command12()
然而,通过使用
-traditional
标志,令牌连接被关闭,所以结果是
command ## 1 ## 2 ## ()
哪个不是有效的 PCL.
对适当的标志有什么建议吗?这两个问题出现在相同的文件中,因此我无法编译具有不同标志的不同文件。我目前最好的想法是使用 sed 将注释替换为其他字符,预处理,然后将它们放回原处。
编辑: 我通过这个答案找到了一个仅 cpp 的解决方案(multipass a source code to cpp),所以我的路线是
cpp -traditional file.pcc | cpp -C
-C
标志表示要保留评论。我必须为每个文件添加一个宏,这样令牌连接就不会在第一次通过时发生
#define DEF_CAT #define CAT(I,J) command ## I ## J ## ()
DEF_CAT