c++ - __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”:只能用于本机成员函数
这甚至是有道理的,因为您将如何调用这些函数?那么,如果不能使用这个关键字,为什么还要存在呢?或者是否有一些可以/必须使用的用例?
解决方案
来自官方__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 代码时,永远不需要明确指定。
推荐阅读
- python - 关于转换 y 和 x 轴的想法
- python - 如何处理使用 simpleITK 加载的图像中的负像素值
- python - 烧瓶集成错误:TypeError:“str”和“int”实例之间不支持“>=”
- atlassian-sourcetree - 当我选择使用外部合并工具解决冲突时,源树没有启动外部合并工具
- postgresql - 如何在 NGINX for PostgreSQL 上配置 proxy_pass?
- ansible - 即使使用 from_json,jinja2 也会将列表转换为字符串
- laravel - 显示图片上传验证错误
- ios - 如何将 textField 键盘更改为仅阿拉伯数字?斯威夫特/ UIKit
- javascript - barba js v2 重新初始化 main.js 脚本
- python - 从包含连续字符字符串和连续后续元素的列表中获取元素