使用 ENSURE 避免代码分析警告的最佳替代方法是什么?
What is the best alternative to using ENSURE to avoid code analysis warnings?
示例:
ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(strAdditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strVerification.LoadString(IDS_STR_SUBMIT_STATS_VERIFICATION_TEXT));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));
定义:
#define ENSURE(cond) ENSURE_THROW(cond, ::AfxThrowInvalidArgException() )
这是一个 Microsoft 宏,虽然我看不到它的文档。当我注意到它在 Microsoft SDK 代码中使用时,我就开始使用它。恼人的是它触发了代码分析:
Warning C26496: The variable '__afx_condVal' does not change after construction, mark it as const (con.4).
我确实用 Microsoft 提出了它。底层宏 ENSURE_THROW
:
#define ENSURE_THROW(cond, exception) \
do { int __afx_condVal=!!(cond); ASSERT(__afx_condVal); if (!(__afx_condVal)){exception;} } __pragma(warning(suppress:4127)) while (false)
...只需要const
这个词就可以解决
有没有我可以做的替代调用,因为我知道 ASSERT
只适用于 DEBUG
构建。
您可以重新定义 ENSURE_THROW
并将其放入您的 stdafx.h
:
#undef ENSURE_THROW
#define ENSURE_THROW(cond, exception) \
do { const int __afx_condVal=!!(cond); ASSERT(__afx_condVal); \
if (!(__afx_condVal)){exception;} } while (false)
它与 afx.h
中的原始 MS 定义相同,但添加了 const
。
这可能会在 MFC 的未来版本中中断,尽管 MS 不太可能更改它。
更简洁的方法是从分析中排除某些头文件,但这取决于您的工具。
请注意 ENSURE
和 ASSERT
是非常不同的东西:
ASSERT(x)
:在调试版本中,如果 x
为假,它将停止程序执行并显示一条消息,在发布版本中,它是一个 NOP,甚至不会评估 x
ENSURE(x)
: x
将被评估,如果它为假,将抛出异常。在调试版本中,在抛出异常之前会显示一个诊断对话框。
示例:
ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(strAdditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strVerification.LoadString(IDS_STR_SUBMIT_STATS_VERIFICATION_TEXT));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));
定义:
#define ENSURE(cond) ENSURE_THROW(cond, ::AfxThrowInvalidArgException() )
这是一个 Microsoft 宏,虽然我看不到它的文档。当我注意到它在 Microsoft SDK 代码中使用时,我就开始使用它。恼人的是它触发了代码分析:
Warning C26496: The variable '__afx_condVal' does not change after construction, mark it as const (con.4).
我确实用 Microsoft 提出了它。底层宏 ENSURE_THROW
:
#define ENSURE_THROW(cond, exception) \
do { int __afx_condVal=!!(cond); ASSERT(__afx_condVal); if (!(__afx_condVal)){exception;} } __pragma(warning(suppress:4127)) while (false)
...只需要const
这个词就可以解决
有没有我可以做的替代调用,因为我知道 ASSERT
只适用于 DEBUG
构建。
您可以重新定义 ENSURE_THROW
并将其放入您的 stdafx.h
:
#undef ENSURE_THROW
#define ENSURE_THROW(cond, exception) \
do { const int __afx_condVal=!!(cond); ASSERT(__afx_condVal); \
if (!(__afx_condVal)){exception;} } while (false)
它与 afx.h
中的原始 MS 定义相同,但添加了 const
。
这可能会在 MFC 的未来版本中中断,尽管 MS 不太可能更改它。
更简洁的方法是从分析中排除某些头文件,但这取决于您的工具。
请注意 ENSURE
和 ASSERT
是非常不同的东西:
ASSERT(x)
:在调试版本中,如果x
为假,它将停止程序执行并显示一条消息,在发布版本中,它是一个 NOP,甚至不会评估x
ENSURE(x)
:x
将被评估,如果它为假,将抛出异常。在调试版本中,在抛出异常之前会显示一个诊断对话框。