C++ 如何在C++;?
我怀疑某些断言代码有副作用。我想关闭ASSERT,而不对代码的编译方式进行任何其他更改。我正在使用MSVS2008。从debug切换到release不会改变内存初始化的方式。如果你是说C++ 如何在C++;?,c++,visual-studio,assertions,C++,Visual Studio,Assertions,我怀疑某些断言代码有副作用。我想关闭ASSERT,而不对代码的编译方式进行任何其他更改。我正在使用MSVS2008。从debug切换到release不会改变内存初始化的方式。如果你是说assert,那么这应该由NDEBUG宏控制。在包含cassert之后,将其放在头文件的顶部(或包含cassert的包含) 它重新定义了断言宏,使其扩展为零。NDEBUG也会更改内存初始化,但如果我没有弄错的话,它会关闭断言(程序终止),但不会删除并停止表达式的求值。也许:#define assert(x)(voi
assert
,那么这应该由NDEBUG宏控制。在包含cassert
之后,将其放在头文件的顶部(或包含cassert
的包含)
它重新定义了断言宏,使其扩展为零。NDEBUG也会更改内存初始化,但如果我没有弄错的话,它会关闭断言(程序终止),但不会删除并停止表达式的求值。也许:
#define assert(x)(void)0
?@UncleBens Ak,您是对的,但是(void)0
不是必需的。但是(x)
是正确的。@Yacoby:一般来说,您需要它是因为将assert
扩展为语句有助于警告等。例如,如果assert
在释放模式下扩展为零,那么if(foo)assert(bar);else断言(baz)代码>可能会对空的if和/或else子句发出警告。至少,C标准的最新草案要求以这种方式实现内置断言。使用上面的#define
关闭断言只会导致预处理器对断言中的语句进行评估。在编译器运行之前,所有#define
语句都将被计算并替换为相应的值,因此此方法不应导致在运行时计算表达式。它不仅可以避免警告,而且可以避免错误。考虑:assert(baz()),assert(bar())如果代码>仅扩展为零,则它将在发布模式下失败。在C++中,我将它扩展到<代码>(VoID)(<代码)>或<代码>((无效)0)< /> >(第二个也有在C中工作的优点)。
#undef assert
#define assert(x) ((void)0)