内联所有函数并获取C代码

时间:2017-03-08 14:18:13

标签: c c-preprocessor inline

是否有一个工具将C源文件作为输入,内联所有函数并输出另一个C源文件?

所有函数都包含在一个文件中,并且没有递归/ gotos。函数不一定具有inline属性。

如果此工具忽略标准库中声明的函数(例如printfmallocsqrt),则可以(实际上是可取的)。

相关问题:link:唯一的答案是错误的。

1 个答案:

答案 0 :(得分:1)

那对你没有帮助。至少对于gcc来说,在将文本源代码转换为内部表示之后就会发生内联。

你可以看看这个:

int x;

__attribute__((always_inline)) inline void foobar () { x--; }

int main() {
    x = 1;
    foobar (); 
    return x;
}

在此处调用g++ example.cpp -O0 -g -E将导致:

✓ pan:~$ g++ example.cpp -O0 -g -E
# 1 "example.cpp"
# 1 "/home/meyer//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "example.cpp"
int x;

__attribute__((always_inline)) inline void foobar () { x--; }

int main() {
    x = 1;
    foobar ();
    return x;
}

但是在使用g++ example.cpp -O0 -g -o example.elf进行编译时,生成的可执行文件将不再具有函数foobar。您可以使用objdump -w | less进行检查,然后与省略属性进行比较。

我使用-O0来防止任何优化发生,因为大多数编译器应该足够聪明,以确定该函数可以简单地优化为int main () { return 0; }

我不知道你是否有尝试做的工具。但我担心你需要一个完整的C ++感知词法分析器/解析器组合,用于C ++ - to-C ++ - 交叉编译器才能在所有情况下正确地执行此操作。