我可以禁用静态断言吗?

时间:2014-10-30 01:52:23

标签: c++ static-assert

我的代码中分散了一些相当昂贵的static_assert个调用。虽然这些很有价值,但它们通常非常丰富,并且对编译时间和内存使用有很大帮助。

我可以禁用它们吗?

2 个答案:

答案 0 :(得分:6)

将它们包裹在标准的NDEBUG宏中。

#ifndef NDEBUG
static_assert(...);
#endif

对于发布版本,您可以像常规assert一样禁用它们。虽然我没有真正看到这个目的。

如果您不想在宏中结束通话,您可以定义一个为您执行此操作的宏:

#ifndef STATIC_ASSERT
#ifndef NDEBUG
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
#else
#define STATIC_ASSERT(...) static_assert(true, "")
#endif // NDEBUG
#endif // STATIC_ASSERT

用法类似于常规static_assert。请注意,如果您的程序定义了关键字并包含标准库标题,那么它是undefined behaviour to define a static_assert macro

答案 1 :(得分:1)

  1. 您可以将它们自己包装在自己的#ifdef

    #ifndef NO_STATIC_ASSERT
    static_assert(...);
    #endif
    
  2. 或者,您可以定义自己的STATIC_ASSERT

    #ifndef NO_STATIC_ASSERT
        #define STATIC_ASSERT(...) /**/
    #else
      #define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
    #endif
    
    • 在实践中,#define static_assert(...)也有效,但它是UB。
  3. 或者,您只需手动删除它们即可。
  4. 这样你就可以消除它们对编译性能的影响(无论如何它们从未对运行时性能产生任何影响)。