我应该提到纯虚函数中的调用约定吗?
Should I mention calling conventions in pure virtual functions?
这是一个示例,IUnknown interface 来自 Windows SDK 中的 Unknown.h
:
- 在 C++ 中:
IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID riid,
void** ppvObject) = 0;
//AddRef
//Release
};
- 在 C:
typedef struct IUnknownVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(
IUnknown* This,
REFIID riid,
void **ppvObject);
//AddRef
//Release
} IUnknownVtbl;
interface IUnknown {
CONST_VTBL IUnknownVtbl* lpVtbl;
};
虚函数前面可以看到STDMETHODCALLTYPE
,一般是__stdcall
。所以,我的问题是,在纯虚函数中提及调用约定是否重要?或者调用约定由编译器或编译器选项在虚拟函数中进行内部管理(例如 /Gz
对应 __stdcall
)?
此外,当我在源代码(或任何编译器选项)中未提及虚函数之前的任何调用约定时,可执行文件工作正常。
您需要指定它们。您通过(本质上)函数指针调用函数这一事实没有区别 - 调用者和被调用函数仍然需要就参数传递顺序等问题达成一致。
但是为什么需要在基数中指定它们class?
首先,如果你不这样做,我希望编译器会抱怨,其次,你可能通过对象或(更有可能)指向所述基 class 的对象的指针来调用所述函数,在在这种情况下,基础 class 中的声明是编译器必须继续进行的所有操作。
这是一个示例,IUnknown interface 来自 Windows SDK 中的 Unknown.h
:
- 在 C++ 中:
IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID riid,
void** ppvObject) = 0;
//AddRef
//Release
};
- 在 C:
typedef struct IUnknownVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(
IUnknown* This,
REFIID riid,
void **ppvObject);
//AddRef
//Release
} IUnknownVtbl;
interface IUnknown {
CONST_VTBL IUnknownVtbl* lpVtbl;
};
虚函数前面可以看到STDMETHODCALLTYPE
,一般是__stdcall
。所以,我的问题是,在纯虚函数中提及调用约定是否重要?或者调用约定由编译器或编译器选项在虚拟函数中进行内部管理(例如 /Gz
对应 __stdcall
)?
此外,当我在源代码(或任何编译器选项)中未提及虚函数之前的任何调用约定时,可执行文件工作正常。
您需要指定它们。您通过(本质上)函数指针调用函数这一事实没有区别 - 调用者和被调用函数仍然需要就参数传递顺序等问题达成一致。
但是为什么需要在基数中指定它们class?
首先,如果你不这样做,我希望编译器会抱怨,其次,你可能通过对象或(更有可能)指向所述基 class 的对象的指针来调用所述函数,在在这种情况下,基础 class 中的声明是编译器必须继续进行的所有操作。