【问题标题】:Assert is seen as C style cast in Visual StudioAssert 在 Visual Studio 中被视为 C 风格转换
【发布时间】:2020-08-14 11:57:49
【问题描述】:

Here is the error and a glimpse of the code 我的一门课程要求我使用警告级别 4 并将警告视为 Visual Studio 中的错误。除此之外,我们还需要激活 Cpp Core Guidelines。然而,自从我激活了这些选项后,我一直被警告错误 C26493 所困扰(不要使用 C 风格的强制转换)。显然,他们认为我的“断言”测试是 C 风格的强制转换。我还没有看到任何其他学生有这个问题。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后请edit 您的问题包括导致错误的minimal reproducible example,并将完整和完整的构建输出复制粘贴(作为文本)到问题中。并在出现错误的行添加注释。
  • 另外,这可能不是你能做的,因为演员表在 assert 宏本身内。所以对你来说这是一个误报。
  • 最后,不要使用assert 作为运行时验证检查。它对“发布”构建没有任何作用,而对于调试构建,如果断言失败,它会“崩溃”程序(这对用户来说是一种相当糟糕的体验)。

标签: c++ visual-studio warnings assert cpp-core-guidelines


【解决方案1】:

Assert 是一个宏,它(在 Visual Studio 中)扩展为:


    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

如您所见,有一个 C 风格的 case 需要作废。

【讨论】:

  • 还有没有像assert这样的工具来做测试?
【解决方案2】:

所有学生都应该看到警告,而不仅仅是你。如果您想避免此警告,请使用使用 C++ 样式转换的 ASSERT 实现。

我一直在使用的任何标准 ASSERT 宏都可以扩展为 C 风格的强制转换为 void 但 gcc c++ 模式:https://github.com/lattera/glibc/blob/master/assert/assert.h

这是我使用 C++ 强制转换的自定义实现的示例。这也是在调试模式下使用全局变量,以便能够在调试时禁用断言。

extern MYUTILS_DLLINTERFACE bool g_MYASSERT_enabled;
extern bool MYUTILS_DLLINTERFACE _is_MYASSERT_enabled();
#ifdef _DEBUG
# define __MYASSERT(x) (static_cast<void>(!_is_MYASSERT_enabled() || (_ASSERTE(x), 0)))
#else
# define __MYASSERT(x) (static_cast<void>(0))
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2020-08-28
    • 2018-05-09
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多