X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57e2b887a0e798ab5ab2921cdeba550f322b000c..49d8a7819b3a04c5a51a4e73c3d5b41d8082972c:/include/wx/wxcrt.h diff --git a/include/wx/wxcrt.h b/include/wx/wxcrt.h index 99c01b94ea..04fffe5a44 100644 --- a/include/wx/wxcrt.h +++ b/include/wx/wxcrt.h @@ -419,8 +419,9 @@ WX_STRCMP_FUNC(wxStricmp, wxCRT_StricmpA, wxCRT_StricmpW, wxStricmp_String) // the template's implementation uses overloaded function declared later (see // the wxStrcoll() call in wxStrcoll_String()), so we have to // forward-declare the template and implement it below WX_STRCMP_FUNC. OTOH, -// this fails to compile with VC6, so don't do it for VC. -#if !defined(__VISUALC__) +// this fails to compile with VC6, so don't do it for VC. It also causes +// problems with GCC visibility in newer GCC versions. +#if !(defined(__VISUALC__) || wxCHECK_GCC_VERSION(3,4)) template inline int wxStrcoll_String(const wxString& s1, const T& s2); WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String) @@ -440,7 +441,7 @@ inline int wxStrcoll_String(const wxString& s1, const T& s2) #endif } -#if defined(__VISUALC__) +#if defined(__VISUALC__) || wxCHECK_GCC_VERSION(3,4) // this is exactly the same WX_STRCMP_FUNC line as above wxStrcoll_String<> WX_STRCMP_FUNC(wxStrcoll, wxCRT_StrcollA, wxCRT_StrcollW, wxStrcoll_String) #endif @@ -771,11 +772,24 @@ inline double wxStrtod(const wxCharTypeBuffer& nptr, T **endptr) // to be ever used, but it still has to compile). template struct wxStrtoxCharType {}; template<> struct wxStrtoxCharType - { typedef const char* Type; }; +{ + typedef const char* Type; + static char** AsPointer(char **p) { return p; } +}; template<> struct wxStrtoxCharType - { typedef const wchar_t* Type; }; +{ + typedef const wchar_t* Type; + static wchar_t** AsPointer(wchar_t **p) { return p; } +}; template<> struct wxStrtoxCharType - { typedef const char* Type; /* this one is never used */ }; +{ + typedef const char* Type; /* this one is never used */ + static char** AsPointer(int WXUNUSED_UNLESS_DEBUG(p)) + { + wxASSERT_MSG( p == 0, "passing non-NULL int is invalid" ); + return NULL; + } +}; template inline double wxStrtod(const wxString& nptr, T endptr) @@ -792,7 +806,9 @@ inline double wxStrtod(const wxString& nptr, T endptr) // note that it is important to use c_str() here and not mb_str() or // wc_str(), because we store the pointer into (possibly converted) // buffer in endptr and so it must be valid even when wxStrtod() returns - return wxStrtod((typename wxStrtoxCharType::Type)nptr.c_str(), endptr); + typedef typename wxStrtoxCharType::Type CharType; + return wxStrtod((CharType)nptr.c_str(), + wxStrtoxCharType::AsPointer(endptr)); } } template @@ -815,8 +831,12 @@ inline double wxStrtod(const wxCStrData& nptr, T endptr) if ( endptr == 0 ) \ return name(nptr.wx_str(), (wxStringCharType**)NULL, base); \ else \ - return name((typename wxStrtoxCharType::Type)nptr.c_str(), \ - endptr, base); \ + { \ + typedef typename wxStrtoxCharType::Type CharType; \ + return name((CharType)nptr.c_str(), \ + wxStrtoxCharType::AsPointer(endptr), \ + base); \ + } \ } \ template \ inline rettype name(const wxCStrData& nptr, T endptr, int base) \