c++ - 将 c 代码的中间表示解析回 c

标签 c++ c gcc clang llvm

我有一个用 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/

相关文章:

c++ - 我们如何从结构中访问#define变量

c++ - C 中的另一个 coredump 问题

c - 串行代码比在 C 中只使用一个线程慢得多?

c - 如何将 64 位整数打印为十六进制?

c++ - lambda 的模板参数推导

c++ - CUDA:如何原子地执行这些指令(4个地址)

链式哈希表没有给出正确的输出

c - 体系结构 x86_64 的 undefined symbol 在 C 中意味着什么?

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

C++ 保护的变量不被继承