首页 > 解决方案 > __thiscall 关键字的用途是什么?

问题描述

通读调用约定时,有一个thiscall目的非常明确的约定。

我知道它thiscall定义了一个作为类的一部分的函数,因为这些函数需要一个对象作为非静态函数的第一个隐藏参数。

所以如果我理解正确,那么下面的函数必须是thiscall. 不需要使用关键字,因为编译器在那里没有太多选择,必须这样声明。

 class Foo
 {
     public:
     int function(void) { return 1; }
 };

现在,当我在这样的类之外声明函数时:

int __thiscall Otherfunction(void) { return 1; }
int __thiscall Otherfunction(Foo *t) { return 1; }

然后我得到编译器错误:

错误 C3865:“__thiscall”:只能用于本机成员函数

这甚至是有道理的,因为您将如何调用这些函数?那么,如果不能使用这个关键字,为什么还要存在呢?或者是否有一些可以/必须使用的用例?

标签: c++visual-c++

解决方案


来自官方__thiscall文档。

在 ARM、ARM64 和 x64 机器上,__thiscall编译器接受并忽略它。这是因为它们默认使用基于寄存器的调用约定。

使用的一个原因__thiscall是在其成员函数__clrcall默认使用的类中。在这种情况下,您可以使用__thiscall使单个成员函数可从本机代码调用。

使用 编译时,除非另有说明,否则/clr:pure所有函数和函数指针都是。__clrcall和编译器选项在 Visual Studio 2015 中已弃用/clr:pure/clr:safe在 Visual Studio 2017 中不受支持。

这似乎意味着__thiscall在 ARM[64] 或 x86 上编写纯 C++(非托管)代码或在 VC++ 2017 及更高版本中编写 C++/CLI 代码时,永远不需要明确指定。


推荐阅读