Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Visual Studio_Assertions - Fatal编程技术网

C++ 如何在C++;?

C++ 如何在C++;?,c++,visual-studio,assertions,C++,Visual Studio,Assertions,我怀疑某些断言代码有副作用。我想关闭ASSERT,而不对代码的编译方式进行任何其他更改。我正在使用MSVS2008。从debug切换到release不会改变内存初始化的方式。如果你是说assert,那么这应该由NDEBUG宏控制。在包含cassert之后,将其放在头文件的顶部(或包含cassert的包含) 它重新定义了断言宏,使其扩展为零。NDEBUG也会更改内存初始化,但如果我没有弄错的话,它会关闭断言(程序终止),但不会删除并停止表达式的求值。也许:#define assert(x)(voi

我怀疑某些断言代码有副作用。我想关闭ASSERT,而不对代码的编译方式进行任何其他更改。我正在使用MSVS2008。从debug切换到release不会改变内存初始化的方式。

如果你是说
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)