我可以禁用静态断言吗?

qua*_*ant 2 c++ static-assert

static_assert我的代码中散布着一些相当昂贵的电话.虽然它们很有价值,但它们通常非常丰富,并且对编译时间和内存使用有很大贡献.

我可以禁用它们吗?

Rap*_*ptz 6

将它们包装在标准NDEBUG宏中.

#ifndef NDEBUG
static_assert(...);
#endif
Run Code Online (Sandbox Code Playgroud)

对于发布版本,您可以像常规一样禁用它们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
Run Code Online (Sandbox Code Playgroud)

用法类似于常规static_assert.请注意,如果您的程序定义了一个关键字并包含一个标准库头,那么定义一个static_assert未定义的行为.

  • 替换`do {} while(0)`对于命名空间作用域或类体中的`static_assert`不起作用. (2认同)