X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..5851053a968330aea0a4bd6918b330eb0bfa0007:/include/wx/debug.h diff --git a/include/wx/debug.h b/include/wx/debug.h index f353646e8b..06f302d820 100644 --- a/include/wx/debug.h +++ b/include/wx/debug.h @@ -1,12 +1,12 @@ /** -* Name: wx/debug.h -* Purpose: Misc debug functions and macros -* Author: Vadim Zeitlin +* Name: wx/debug.h +* Purpose: Misc debug functions and macros +* Author: Vadim Zeitlin * Modified by: Ryan Norton (Converted to C) -* Created: 29/01/98 -* RCS-ID: $Id$ -* Copyright: (c) 1998 Vadim Zeitlin -* Licence: wxWindows licence +* Created: 29/01/98 +* RCS-ID: $Id$ +* Copyright: (c) 1998 Vadim Zeitlin +* Licence: wxWindows licence */ /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ @@ -47,12 +47,30 @@ #endif /* !WXDEBUG */ #endif /* __WXDEBUG__ */ +#ifndef __WXFUNCTION__ + /* TODO: add more compilers supporting __FUNCTION__ */ + #if defined(__DMC__) + /* + __FUNCTION__ happens to be not defined within class members + http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485 + */ + #define __WXFUNCTION__ (NULL) + #elif defined(__GNUC__) || \ + (defined(_MSC_VER) && _MSC_VER >= 1300) || \ + defined(__FUNCTION__) + #define __WXFUNCTION__ __FUNCTION__ + #else + /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */ + #define __WXFUNCTION__ (NULL) + #endif +#endif /* __WXFUNCTION__ already defined */ + /* ---------------------------------------------------------------------------- */ /* Debugging macros */ /* */ /* All debugging macros rely on ASSERT() which in turn calls user-defined */ /* OnAssert() function. To keep things simple, it's called even when the */ -/* expression is TRUE (i.e. everything is ok) and by default does nothing: just */ +/* expression is true (i.e. everything is ok) and by default does nothing: just */ /* returns the same value back. But if you redefine it to do something more sexy */ /* (popping up a message box in your favourite GUI, sending you e-mail or */ /* whatever) it will affect all ASSERTs, FAILs and CHECKs in your code. */ @@ -72,16 +90,19 @@ /* NB: these functions are implemented in src/common/appcmn.cpp */ #if defined(__cplusplus) && defined(__WXDEBUG__) /* - this function may be redefined to do something non trivial and is called - whenever one of debugging macros fails (i.e. condition is false in an - assertion) + This function is called whenever one of debugging macros fails (i.e. + condition is false in an assertion). To customize its behaviour, override + wxApp::OnAssert(). - parameters: + Parameters: szFile and nLine - file name and line number of the ASSERT + szFunc - function name of the ASSERT, may be NULL (NB: ASCII) + szCond - text form of the condition which failed szMsg - optional message explaining the reason */ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile, int nLine, + const char *szFunc, const wxChar *szCond, const wxChar *szMsg = NULL); @@ -89,23 +110,25 @@ /* the program is running under debugger, of course) */ extern void WXDLLIMPEXP_BASE wxTrap(); - /* helper function used to implement wxASSERT and wxASSERT_MSG */ - /* */ - /* note using "int" and not "bool" for cond to avoid VC++ warnings about */ - /* implicit conversions when doing "wxAssert( pointer )" and also use of */ - /* "!!cond" below to ensure that everything is converted to int */ - extern void WXDLLIMPEXP_BASE wxAssert(int cond, - const wxChar *szFile, - int nLine, - const wxChar *szCond, - const wxChar *szMsg = NULL) ; - /* generic assert macro */ - #define wxASSERT(cond) wxAssert(!!(cond), __TFILE__, __LINE__, _T(#cond)) + #define wxASSERT(cond) wxASSERT_MSG(cond, NULL) /* assert with additional message explaining it's cause */ - #define wxASSERT_MSG(cond, msg) \ - wxAssert(!!(cond), __TFILE__, __LINE__, _T(#cond), msg) + #define wxASSERT_MSG(cond, msg) \ + if ( cond ) \ + ; \ + else \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) + + /* special form of assert: always triggers it (in debug mode) */ + #define wxFAIL wxFAIL_MSG(NULL) + + /* FAIL with some message */ + #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg) + + /* FAIL with some message and a condition */ + #define wxFAIL_COND_MSG(cond, msg) \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(cond), msg) /* an assert helper used to avoid warning when testing constant expressions, */ /* i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about */ @@ -121,23 +144,20 @@ /* nothing to do in release modes (hopefully at this moment there are */ /* no more bugs ;-) */ #define wxASSERT(cond) - #define wxASSERT_MSG(x, m) + #define wxASSERT_MSG(cond, msg) + #define wxFAIL + #define wxFAIL_MSG(msg) + #define wxFAIL_COND_MSG(cond, msg) #endif /* __WXDEBUG__ */ #ifdef __cplusplus - /* Use of wxFalse instead of FALSE suppresses compiler warnings about testing */ + /* Use of wxFalse instead of false suppresses compiler warnings about testing */ /* constant expression */ - WXDLLIMPEXP_DATA_BASE(extern const bool) wxFalse; + extern WXDLLIMPEXP_DATA_BASE(const bool) wxFalse; #endif #define wxAssertFailure wxFalse -/* special form of assert: always triggers it (in debug mode) */ -#define wxFAIL wxASSERT(wxAssertFailure) - -/* FAIL with some message */ -#define wxFAIL_MSG(msg) wxASSERT_MSG(wxAssertFailure, msg) - /* NB: the following macros work also in release mode! */ /* @@ -148,16 +168,24 @@ */ /* check that expression is true, "return" if not (also FAILs in debug mode) */ -#define wxCHECK(x, rc) if (!(x)) {wxFAIL; return rc; } +#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, NULL) /* as wxCHECK but with a message explaining why we fail */ -#define wxCHECK_MSG(x, rc, msg) if (!(x)) {wxFAIL_MSG(msg); return rc; } +#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg) /* check that expression is true, perform op if not */ -#define wxCHECK2(x, op) if (!(x)) {wxFAIL; op; } +#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, NULL) /* as wxCHECK2 but with a message explaining why we fail */ -#define wxCHECK2_MSG(x, op, msg) if (!(x)) {wxFAIL_MSG(msg); op; } +#define wxCHECK2_MSG(cond, op, msg) \ + if ( cond ) \ + ; \ + else \ + { \ + wxFAIL_COND_MSG(#cond, msg); \ + op; \ + } \ + struct wxDummyCheckStruct /* just to force a semicolon */ /* special form of wxCHECK2: as wxCHECK, but for use in void functions */ /* */ @@ -165,7 +193,7 @@ /* there is no other way to tell the caller what exactly went wrong */ /* from the void function (of course, the function shouldn't be void */ /* to begin with...) */ -#define wxCHECK_RET(x, msg) if (!(x)) {wxFAIL_MSG(msg); return; } +#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg) /* ---------------------------------------------------------------------------- */ /* Compile time asserts */ @@ -198,8 +226,17 @@ It may be used both within a function and in the global scope. */ -#define wxCOMPILE_TIME_ASSERT(expr, msg) \ - struct wxMAKE_UNIQUE_ASSERT_NAME { unsigned int msg: expr; } +#if defined(__WATCOMC__) && defined(__cplusplus) + /* avoid "unused symbol" warning */ + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + class wxMAKE_UNIQUE_ASSERT_NAME { \ + unsigned int msg: expr; \ + wxMAKE_UNIQUE_ASSERT_NAME() { wxUnusedVar(msg); } \ + } +#else + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + struct wxMAKE_UNIQUE_ASSERT_NAME { unsigned int msg: expr; } +#endif /* When using VC++ 6 with "Edit and Continue" on, the compiler completely @@ -224,12 +261,15 @@ /* other miscellaneous debugger-related functions */ /* ---------------------------------------------------------------------------- */ -/* return true if we're running under debugger */ -/* */ -/* currently this only really works under Mac in CodeWarrior builds, it always */ -/* returns false otherwise */ +/* + Return true if we're running under debugger. + + Currently this only really works under Win32 and Mac in CodeWarrior builds, + it always returns false in other cases. + */ #ifdef __cplusplus - #ifdef __WXMAC__ + /* ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port */ + #if defined(__WXMAC__) || defined(__WIN32__) extern bool WXDLLIMPEXP_BASE wxIsDebuggerRunning(); #else /* !Mac */ inline bool wxIsDebuggerRunning() { return false; } @@ -237,4 +277,3 @@ #endif /* __cplusplus */ #endif /* _WX_DEBUG_H_ */ -