我的代码中散布着一些相当昂贵的static_assert
调用。尽管它们很有价值,但它们经常是多余的,并且会显著地影响编译时间和内存使用。
我能否禁用它们?
我的代码中散布着一些相当昂贵的static_assert
调用。尽管它们很有价值,但它们经常是多余的,并且会显著地影响编译时间和内存使用。
我能否禁用它们?
将它们包裹在标准的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
类似。请注意,如果您的程序定义了一个关键字并包含一个标准库头文件,则定义static_assert
宏是未定义的行为。
static_assert
)与运行时检查耦合在一起。如果你想移除其中一个,很可能你并不想禁用其他的检查。 - DeduplicatorNDEBUG
。 - Rapptzdo { } while(0)
不能用于static_assert
。 - reima你可以将它们分别包装在自己的 #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(...)
也可以使用,但这是未定义行为。static_assert
宏是未定义行为。 - Rapptz
static_assert
调用是导致所有开销的原因吗? - Brian Bistatic_assert
的唯一方法是将其从将要编译的代码中删除,例如通过使用预处理器。它们不会以任何方式对编译后的代码做出贡献。 - Deduplicator