2

我想申请__declspec(nothrow)一些返回对象引用的成员函数。例如,我想将它添加到这个函数中(在 MyClass.h 中):

CMyClass& operator= ( IN UInt32 nValue )
{
    return ( SetValue ( nValue ) );
};

VC++ 文档说我需要在函数的返回类型之后添加它,如下所示:

return-type __declspec(nothrow) [call-convention] function-name ([argument-list])

如果我遵循这一点,我的大部分功能都可以正常使用__declspec(nothrow). 但是,当我为上述成员函数(或任何其他返回 a 的函数CMyClass&)执行此操作时,会出现编译错误:

error C2059: syntax error : '__declspec(nothrow)'

我可以把它放在返回类型的前面,然后编译,但文档还说,如果 __declspec() 放置在错误的位置,编译器可能会忽略它而不会发出警告或错误。

正确的使用方法是__declspec(nothrow)什么?

4

1 回答 1

3

我相信(但不是 100% 确定)正确的语法是:

CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )

似乎编译器对函数声明遵循与对简单声明相同的规则,并且&(或*)在declspec. 这与一些MSDN 文档相匹配。

__declspec 关键字应放在简单声明的开头。编译器会忽略放置在 * 或 & 之后以及声明中变量标识符之前的任何 __declspec 关键字,而不会发出警告。

但是,正如其他人指出的那样,这是在浪费时间。 throw()没有相同的奇怪解析问题,并且文档明确指出它是等效的。

给定以下预处理器指令,以下三个函数声明是等效的:

#define WINAPI __declspec(nothrow) __stdcall

无效的 WINAPI f1();
无效 __declspec(nothrow) __stdcall f2();
void __stdcall f3() throw();

于 2012-02-10T06:24:44.740 回答