如何使用g ++获取C++头文件(.hpp)的汇编代码?

Mik*_*ike 2 c++ assembly header

我有兴趣尝试查看头文件的汇编代码.使用带有虚拟主方法的简单.cpp文件,并编译它很容易:g++ -S -o prog.exe main.cpp

但是,我现在要进入头文件.我有一个虚拟头文件func.hpp,只包含一个虚拟方法,现在我希望能够编译它并在.S文件中查看它的程序集.(这样做的主要原因是,如果我有一个更复杂的功能,也许我可以在汇编中进行一些手动优化,并通过构建最终的可执行文件g++ -o prog.exe func.S main.cpp.

但是,我无法找到解释这一点的来源.如果我尝试,g++ -S -o func.S func.hpp 我会收到一条错误消息output filename specified twice.谁能帮我这个?

供参考,这里是func.hpp:

int number()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我也在尝试使用另一个名为struct.hpp的hpp文件:

struct Coord
{
    int x;
    int y;
};
Run Code Online (Sandbox Code Playgroud)

两者都有相同的错误,但我希望能够看到两个头文件的程序集而不将它们转换为.cpp文件(因为这会破坏头文件的含义.)

ken*_*ytm 6

您可以强制g ++将.hpp文件视为C++源文件.

g++ -x c++ -S -o func.S func.hpp
Run Code Online (Sandbox Code Playgroud)

你得到"输出文件名指定两次"消息的原因是,当将头文件传递给gcc时,它会假定你想将它编译成预编译的头.正如命名一样,这将"编译"标题,因此将在中间生成*.s文件.如果-v使用原始命令传递标志,您将看到cc1plus被调用如下:

 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/cc1plus
     -quiet
     -v 
     -D_GNU_SOURCE 
     func.hpp
     -quiet 
     -dumpbase func.hpp 
     -mtune=generic 
     -march=x86-64 
     -auxbase-strip func.S
     -version 
     -o func.S                # <---
     -o /tmp/ccxEg3J7.s       # <---
     --output-pch= func.S
Run Code Online (Sandbox Code Playgroud)

确实-o是指定两次,一次来自你-o和一次来自编译器.

(当然编译器可以避免添加-o /tmp/ccxEg3J7.s,但是这个边缘情况增加的复杂性并不值得.)