Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内联所有函数并获取C代码_C_C Preprocessor_Inline - Fatal编程技术网

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

内联所有函数并获取C代码,c,c-preprocessor,inline,C,C Preprocessor,Inline,是否有一个工具可以将一个C源文件作为输入,内联所有函数并输出另一个C源文件 所有函数都包含在一个文件中,并且没有递归/goto。函数不一定具有inline属性 如果此工具忽略标准库中声明的函数(如printf、malloc和sqrt),则是可以的(实际上也是可取的) 相关问题:唯一的答案是不正确的。这对你没有帮助。至少对于gcc来说,内联是在文本源代码转换为内部表示之后发生的 你可以看看这个: int x; __attribute__((always_inline)) inline void

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

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

如果此工具忽略标准库中声明的函数(如
printf
malloc
sqrt
),则是可以的(实际上也是可取的)


相关问题:唯一的答案是不正确的。

这对你没有帮助。至少对于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;
}
✓ pan:~$g++example.cpp-O0-g-E
#1“example.cpp”
#1“home/meyer/”
# 1 ""
# 1 ""
#1“/usr/include/stdc predef.h”1 3 4
# 1 "" 2
#1“example.cpp”
int x;
__属性uu((始终inline))内联void foobar(){x--}
int main(){
x=1;
foobar();
返回x;
}
但是当使用
g++example.cpp-O0-g-o example.elf
编译时,生成的可执行文件将不再具有函数
foobar
。您可以使用
objdump-w | less
进行检查,并与省略该属性进行比较

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


我不知道是否有一个工具,你试图在那里做什么。但是,恐怕您需要一个完整的C++感知词法分析器/语法分析器组合,以便C++到C++的交叉编译器在所有情况下都能正确地执行此操作。

唯一的答案是不正确的方法!?GCC特有的属性正如广告中所说的那样。这没有错,它只是不符合这个问题的要求(因为它们是完全不同的问题)。在我看来,这要么是不可能的,要么是毫无意义的:内联工作是因为不需要参数传递,而且变量在调用者和被调用者之间共享。这个过程依赖于(寄存器)分配,它依赖于编译器和体系结构。例如:想象一下,如果在一台具有32个寄存器的机器上内联,并在一台具有较少寄存器的机器上编译预处理代码,会发生什么情况:寄存器破坏将是结果。这不是一个简单的预处理转换,因为标准C没有能够容纳局部变量的表达式构造。也不能在表达式中轻松表达控制流。您可以尝试使用clang或其他编译器库生成内联代码的内部表示,然后尝试从中重新创建C代码,但这将需要大量的工作,并且结果不会特别可读。也许这是一个X-Y问题,你需要问一个更直接的问题,关于你真正需要什么。