当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不被编译。
=======================
事实上, assert 是个宏, 它是扩展为什么都不干还是调用一个函数做真正的断言只取决于一个因素:
NDEBUG 定义了, 它就啥事不干.
NDEBUG 没定义, 它就做断言.
与_DEBUG 这个宏的定义与否无关.
那么VC的Debug下为什么要定义一个 _DEBUG呢, 答案是: VC定义_DEBUG有其用途, 它控制其它宏比如 _ASSERTE是的行为, 但与assert 无关, 我这里说的assert是ANSI C标准的assert, 不是泛指VC提供的众多断言相关的宏.
可以拿简单的程序试验:
vcvars32.bat
cl test.cpp && test.exe
cl /D _DEBUG test.cpp && test.exe
cl /D NDEBUG test.cpp && test.exe
注意, 虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG宏, 但这个宏的引入不是微软特定的, 它是由ANSI C的assert决定的.
=======================
事实上, assert 是个宏, 它是扩展为什么都不干还是调用一个函数做真正的断言只取决于一个因素:
NDEBUG 定义了, 它就啥事不干.
NDEBUG 没定义, 它就做断言.
与_DEBUG 这个宏的定义与否无关.
那么VC的Debug下为什么要定义一个 _DEBUG呢, 答案是: VC定义_DEBUG有其用途, 它控制其它宏比如 _ASSERTE是的行为, 但与assert 无关, 我这里说的assert是ANSI C标准的assert, 不是泛指VC提供的众多断言相关的宏.
可以拿简单的程序试验:
|
vcvars32.bat
cl test.cpp && test.exe
cl /D _DEBUG test.cpp && test.exe
cl /D NDEBUG test.cpp && test.exe
注意, 虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG宏, 但这个宏的引入不是微软特定的, 它是由ANSI C的assert决定的.