【发布时间】:2014-03-19 10:21:39
【问题描述】:
在 VS 2008 中编译我的 vc++ 代码时生成的这个特殊警告让我困扰了一段时间。在浏览 SO 和微软论坛中有关此警告的相关帖子时,建议使用 pragma 警告禁用警告,但是有没有办法在没有警告 pragma 的情况下解决此问题?
class CBLockException : public CBException
{
public:
// Constructor
CBLockException();
CBLockException(const char *tag);
CBLockException(const char *func, const char *tag, const char *msg = NULL);
};
class CLASS_DECL_BASEOBJECTS CBLock : public CBObject
{
public:
enum Locktype { READLOCK, WRITELOCK };
CBLock() throw (CBLockException*); // C4290
virtual ~CBLock();
void Lock(Locktype lockType = WRITELOCK);
void Unlock(Locktype lockType = WRITELOCK);
private:
class LockImplementation;
LockImplementation *lockImp;
};
class CBLock::LockImplementation
{
public:
LockImplementation() throw (CBLockException*); //C4290
~LockImplementation();
CRITICAL_SECTION csExclusive;
CRITICAL_SECTION csReader;
HANDLE hevReadDone;
int cReader;
};
【问题讨论】:
-
“解决问题”是什么意思? MSVC 没有完全实现异常规范的强制语义(这是警告告诉你的)。所以如果你想要完整的语义,你需要使用不同的编译器。如果你想继续使用 MSVC 编译器,并且你不介意它对异常规范的不符合处理,那么通过禁用警告来确认这一点。无论哪种方式,问题都已解决。
-
动态异常规范在 C++ 中已被弃用,因此最好的解决方案是将它们从您的代码中删除。
标签: visual-c++