我有一个用 c 编程语言编写的文件,并使用 CIL 进行了预处理。现在在这个文件中调用了一个函数 say foo() 。我想修改此文件中的 C 代码,以便对 foo() 的所有调用都处于 #ifdef 保护之下。我只想保护调用而不是函数体,这样我就可以更好地控制调用。调用可以在 if 条件或 while 循环内。宏名称规则:名称以MACRO_开头,以原代码中函数调用foo()的行号结束。
这将在一个工具内实现自动化,我正在寻找一个可以解析 c 代码的编译器来执行此操作。
例子:
输入源文件
void foo(int x){
// do something
}
int main(){
int a;
printf("doing something");
foo(a);
printf("doing something again");
foo(a);
return 0;
}
期望的输出
void foo(int x){
// do something
}
int main(){
int a;
printf("doing something");
#ifdef MACRO_1
foo(a);
#endif
printf("doing something again");
#ifdef MACRO_2
foo(a);
#endif
return 0;
}
最佳答案
对于 SIMPLE 源代码,您显然可以使用一个简单的脚本和一些您喜欢的脚本语言(perl、php、awk、python 等)的正则表达式来完成此操作。但是,如果您开始决定支持 if 语句中的函数调用、成员函数调用等 [并希望最终得到实际编译为正确程序的输出代码],它确实会变得越来越困难。
在这种情况下,您需要能够阅读(和“理解”)C 或 C++ 并生成某种中间形式的东西,然后您可以处理并重新发布经过修改的源代码。编写这样的代码绝非易事,无论您从哪里开始。一种解决方案可能是将 Clang 用作库。它具有从抽象语法树 (AST) 形式重写 C 或 C++ 代码的功能。此链接显示了此类重写器的示例:http://eli.thegreenplace.net/2012/06/08/basic-source-to-source-transformation-with-clang
如果你有这样的代码,我不确定你到底想做什么:
if (x)
foo();
bar();
很明显,只需为调用 foo();
插入 #if将导致调用 bar()
仅在 x
时调用是真的,这可能不是你想要的......
关于c++ - 将 c 代码的中间表示解析回 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28780828/