user-0 提问: VS2008下assert头文件

回复:
user: user-0
content: 引用 10 楼 wx7864566 的回复:[quote=引用 9 楼 skyliuxu 的回复:] [quote=引用 7 楼 wx7864566 的回复:] [quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊[/quote] 你这样使用本来就是错的,怎么解决[/quote] 好吧，受教了，谢谢你的热心解答哈

user: user-1
content: 引用 9 楼 skyliuxu 的回复:[quote=引用 7 楼 wx7864566 的回复:] [quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊[/quote] 你这样使用本来就是错的,怎么解决

user: user-0
content: 引用 7 楼 wx7864566 的回复:[quote=引用 6 楼 skyliuxu 的回复:] [quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧[/quote] 问题没解决啊

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-1
content: 引用 6 楼 skyliuxu 的回复:[quote=引用 5 楼 wx7864566 的回复:] 你自己写个函数,穿个开关不就行了 我就是想知道背后的原因[/quote]  原因告诉你了 ,结贴吧

user: user-0
content: 引用 5 楼 wx7864566 的回复:你自己写个函数,穿个开关不就行了 我就是想知道背后的原因

user: user-1
content: 你自己写个函数,穿个开关不就行了

user: user-0
content: 引用 3 楼 wx7864566 的回复:#include 不要写在函数体内 NDEBUG不就是用来控制assert是否有效的么？不这样的话，我怎么让最后三个assert生效呢？ 另外，按照这里的错误提示，__cplusplus是生效的，但我明确是.c文件了啊？

user: user-1
content: #include 不要写在函数体内

user: user-0
content: 引用 1 楼 wx7864566 的回复:以下是assert.h的内容  /*** *assert.h - define the assert macro * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Defines the assert(exp) macro. *       [ANSI/System V] * *       [Public] * ****/  #include <crtdefs.h>  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" { #endif  _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);  #ifdef  __cplusplus } #endif  #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )  #endif  /* NDEBUG */    #undef NDEBUG //取消定义  #include <assert.h> //assert定义  int main(void)  {          int a = 0;           assert(1);          assert(a == 0);          assert(a != 1);  #define NDEBUG  #include <assert.h>          assert(a == 0);          assert(a != 1);  #undef NDEBUG   //取消定义  #include <assert.h> //定义          assert(a == 0);          assert(a != 1);          assert(0);          return 0;  }   在最后一次包含assert.h的时候由于取消定义了NDEBUG,所辖下面的预处理操作被包含在main函数体中,这是错误的.  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" {                     //在main函数中extern "C" 语法错误. #endif 那怎么解决呢？是编译器设置的问题？

user: user-1
content: 以下是assert.h的内容  /*** *assert.h - define the assert macro * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Defines the assert(exp) macro. *       [ANSI/System V] * *       [Public] * ****/  #include <crtdefs.h>  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" { #endif  _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);  #ifdef  __cplusplus } #endif  #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )  #endif  /* NDEBUG */    #undef NDEBUG //取消定义  #include <assert.h> //assert定义  int main(void)  {          int a = 0;           assert(1);          assert(a == 0);          assert(a != 1);  #define NDEBUG  #include <assert.h>          assert(a == 0);          assert(a != 1);  #undef NDEBUG   //取消定义  #include <assert.h> //定义          assert(a == 0);          assert(a != 1);          assert(0);          return 0;  }   在最后一次包含assert.h的时候由于取消定义了NDEBUG,所辖下面的预处理操作被包含在main函数体中,这是错误的.  #undef  assert  #ifdef  NDEBUG  #define assert(_Expression)     ((void)0)  #else  #ifdef  __cplusplus extern "C" {                     //在main函数中extern "C" 语法错误. #endif