预处理器标志适用于不标记化但仍然进行连接

问题描述 投票:0回答:0

我继承了一些 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
c++ c-preprocessor preprocessor
© www.soinside.com 2019 - 2024. All rights reserved.