我在 Windows 中使用 mingw 编译 C 和汇编代码,其中几个函数具有 fastcall 调用约定(如 Microsoft 定义的那样)。如果我在声明中使用 __fastcall,mingw 会执行 Windows 所做的操作并进行 name 装饰:
名称前有一个 at 符号 (@);参数列表中后跟字节数(十进制)的 at 符号后缀为名称
这工作正常。我有以下形式的装配标签:
.global @myfunction@4
@myfunction@4:
....code....
但是当我移植到 Linux(x86,32 位)时,这被证明是一个大问题。Gcc 突然不喜欢 __fastcall (或 __cdecl )并且根本不喜欢标签中的@。我不确定如何统一这两个问题——要么让 Linux 中的 gcc 喜欢 @,要么让 Windows 中的 mingw 不添加 @。
另外:我可以使用__attribute__(__cdecl__)
代替,__cdecl
但我对它的去向感到困惑。我假设在函数名本身之前,但我看到人们把它放在声明之后和分号之前。我也可以吗?