Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?

Posted

技术标签:

【中文标题】Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?【英文标题】:Does Visual C++ provide a language construct with the same functionality as `__attribute__((alias))` in GCC?Visual C++ 是否提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构? 【发布时间】:2018-11-19 19:34:58 【问题描述】:

__attribute__((alias)) means:

别名(“目标”)

alias 属性导致声明作为另一个符号的别名发出,必须指定。例如,

  void __f ()  /* Do something. */; 
  void f () __attribute__ ((weak, alias ("__f")));

f 定义为__f 的弱别名。在 C++ 中,必须使用目标的错位名称。如果__f 没有在同一个翻译单元中定义,则会出错。

并非所有目标机器都支持此属性。

【问题讨论】:

Does Windows have a __declspec equivalent to Unix GCC's __attribute__((weak))?的可能重复 #pragma comment(linker, "/alternatename:f=__f") 必须是(其中 f 和 __f 必须是完全错位的名称) @RbMm:这看起来不像是重复的。 @R.. - 可能是我弄错了。但是这 - ***.com/a/12397639/6401656 是当前问题的答案 @RbMm:“相同的解决方案有效”并不意味着 question 是重复的。 【参考方案1】:

您可以对 C 执行类似操作。x86 和 x64 支持 msvc v19.15。

#include <stdio.h>

void __f()  puts("This function is aliased"); 

void f();

#pragma comment(linker, "/alternatename:f=__f")

int main()

    f();

查看编译后的演示here。

我已经在 Visual Studio 2017 中使用 /TC 选项对此进行了测试。

【讨论】:

编译这里没有任何证据。需要链接,因为 f 如果在链接时找不到重定向到 __f#pragma comment(linker, "/alternatename:f=__f") 也仅适用于 x64c 代码。对于 c++ 代码符号将被破坏?f@@YAXXZ=?__f@@YAXXZ 必须是。对于 cx86 也将依赖于 calin 约定。说 _f=___f 代表 __cdecl 或 _f@0=___f@0 代表 __stdcall 和 @f@0=@__f@0 代表 __fastcall 我在我的电脑上测试了它。但我显然无法在这里链接它。 rextester 有一个旧版本的 VC++ 编译器。 只有当你编译为 c 代码和目标平台 x64 时你当前的代码才会正常,否则你得到未解析的外部符号

以上是关于Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?的主要内容,如果未能解决你的问题,请参考以下文章

线程(c++ 中的并行计算)是不是与优化级别(gcc)不兼容?

Linux下Visual Studio与gcc的C++兼容性

C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”

我可以将 Visual C++ 用于将使用 gcc 编译的作业吗?

等效于 Visual C++ 中 gcc 的 __attribute__ 格式

Visual Studio C++ 位域结构体大小问题