我的代码中分散了一些相当昂贵的static_assert
个调用。虽然这些很有价值,但它们通常非常丰富,并且对编译时间和内存使用有很大帮助。
我可以禁用它们吗?
答案 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)
您可以将它们自己包装在自己的#ifdef
:
#ifndef NO_STATIC_ASSERT
static_assert(...);
#endif
或者,您可以定义自己的STATIC_ASSERT
:
#ifndef NO_STATIC_ASSERT
#define STATIC_ASSERT(...) /**/
#else
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
#endif
#define static_assert(...)
也有效,但它是UB。这样你就可以消除它们对编译性能的影响(无论如何它们从未对运行时性能产生任何影响)。