Only disable use of non-ANSI functions in strict ANSI mode under Windows.
The changes of r62518 fixed compilation of wx headers in g++ strict ANSI mode (enabled by th use of -ansi or -std=c++{98,0x} options) with mingw32 but broke it when using g++ in ANSI mode under Unix. The problems arose at least due to redeclaration of isascii() with different exception specifier and due to the lack of wxCRT_StrdupA() definition in the library. Fix this by simply not disabling the use of non-ANSI functions such as isascii() and strdup() under Unix as they are still available in the headers by default because of _GNU_SOURCE predefined by g++. Notice that if _GNU_SOURCE is explicitly undefined, compilation would probably still be broken. To fix this we might check whether __USE_SVID is defined under Linux. Unfortunately doing tests in configure is not an answer as wxWidgets might not be compiled with the same -std option as the programs using it, so there is no obviously correct way to fix this. See #11374. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63164 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -357,7 +357,7 @@ enum wxFileKind
|
|||||||
|
|
||||||
// finally the default char-type versions
|
// finally the default char-type versions
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
#if wxUSE_UNICODE_MSLU || defined(__STRICT_ANSI__)
|
#if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__)
|
||||||
// implement the missing file functions in Win9x ourselves
|
// implement the missing file functions in Win9x ourselves
|
||||||
WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name,
|
WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name,
|
||||||
int flags, int mode);
|
int flags, int mode);
|
||||||
|
@@ -52,12 +52,24 @@
|
|||||||
char *strtok_r(char *, const char *, char **);
|
char *strtok_r(char *, const char *, char **);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Using -std=c++{98,0x} option with mingw32 disables most of standard
|
||||||
|
library extensions, so we can't rely on the presence of common non-ANSI
|
||||||
|
functions, define a special symbol to test for this. Notice that this
|
||||||
|
doesn't need to be done for g++ under Linux where _GNU_SOURCE (which is
|
||||||
|
defined by default) still makes all common extensions available even in
|
||||||
|
ANSI mode.
|
||||||
|
*/
|
||||||
|
#if defined(__MINGW32__) && defined(__STRICT_ANSI__)
|
||||||
|
#define __WX_STRICT_ANSI_GCC__
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
a few compilers don't have the (non standard but common) isascii function,
|
a few compilers don't have the (non standard but common) isascii function,
|
||||||
define it ourselves for them
|
define it ourselves for them
|
||||||
*/
|
*/
|
||||||
#ifndef isascii
|
#ifndef isascii
|
||||||
#if defined(__MWERKS__) || defined(__STRICT_ANSI__)
|
#if defined(__MWERKS__) || defined(__WX_STRICT_ANSI_GCC__)
|
||||||
#define wxNEED_ISASCII
|
#define wxNEED_ISASCII
|
||||||
#elif defined(_WIN32_WCE)
|
#elif defined(_WIN32_WCE)
|
||||||
#if _WIN32_WCE <= 211
|
#if _WIN32_WCE <= 211
|
||||||
@@ -180,12 +192,15 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
|
|||||||
Mac and OpenVMS do not have wcsdup: */
|
Mac and OpenVMS do not have wcsdup: */
|
||||||
#if defined(__VISUALC__) && __VISUALC__ >= 1400
|
#if defined(__VISUALC__) && __VISUALC__ >= 1400
|
||||||
#define wxCRT_StrdupA _strdup
|
#define wxCRT_StrdupA _strdup
|
||||||
#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) && !defined(__STRICT_ANSI__)
|
#elif !((defined(__MWERKS__) && defined(__WXMAC__)) || \
|
||||||
|
defined(__WXWINCE__) || \
|
||||||
|
defined(__WX_STRICT_ANSI_GCC__))
|
||||||
#define wxCRT_StrdupA strdup
|
#define wxCRT_StrdupA strdup
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// all compilers except Cygwin provide _wcsdup() under Windows
|
// most Windows compilers provide _wcsdup()
|
||||||
#if defined(__WINDOWS__) && !defined(__CYGWIN__) && !defined(__STRICT_ANSI__)
|
#if defined(__WINDOWS__) && \
|
||||||
|
!(defined(__CYGWIN__) || defined(__WX_STRICT_ANSI_GCC__))
|
||||||
#define wxCRT_StrdupW _wcsdup
|
#define wxCRT_StrdupW _wcsdup
|
||||||
#elif defined(HAVE_WCSDUP)
|
#elif defined(HAVE_WCSDUP)
|
||||||
#define wxCRT_StrdupW wcsdup
|
#define wxCRT_StrdupW wcsdup
|
||||||
@@ -266,7 +281,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
|
|||||||
(defined(__MWERKS__) && defined(__INTEL__))
|
(defined(__MWERKS__) && defined(__INTEL__))
|
||||||
#define wxCRT_StricmpA _stricmp
|
#define wxCRT_StricmpA _stricmp
|
||||||
#define wxCRT_StrnicmpA _strnicmp
|
#define wxCRT_StrnicmpA _strnicmp
|
||||||
#elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__STRICT_ANSI__))
|
#elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__WX_STRICT_ANSI_GCC__))
|
||||||
#define wxCRT_StricmpA strcasecmp
|
#define wxCRT_StricmpA strcasecmp
|
||||||
#define wxCRT_StrnicmpA strncasecmp
|
#define wxCRT_StrnicmpA strncasecmp
|
||||||
/* #else -- use wxWidgets implementation */
|
/* #else -- use wxWidgets implementation */
|
||||||
@@ -460,7 +475,7 @@ WXDLLIMPEXP_BASE wchar_t *wxCRT_StrtokW(wchar_t *psz, const wchar_t *delim, wcha
|
|||||||
#else /* Unicode filenames */
|
#else /* Unicode filenames */
|
||||||
/* special case: these functions are missing under Win9x with Unicows so we
|
/* special case: these functions are missing under Win9x with Unicows so we
|
||||||
have to implement them ourselves */
|
have to implement them ourselves */
|
||||||
#if wxUSE_UNICODE_MSLU || defined(__STRICT_ANSI__)
|
#if wxUSE_UNICODE_MSLU || defined(__WX_STRICT_ANSI_GCC__)
|
||||||
WXDLLIMPEXP_BASE FILE* wxMSLU__wfopen(const wchar_t *name, const wchar_t *mode);
|
WXDLLIMPEXP_BASE FILE* wxMSLU__wfopen(const wchar_t *name, const wchar_t *mode);
|
||||||
WXDLLIMPEXP_BASE FILE* wxMSLU__wfreopen(const wchar_t *name, const wchar_t *mode, FILE *stream);
|
WXDLLIMPEXP_BASE FILE* wxMSLU__wfreopen(const wchar_t *name, const wchar_t *mode, FILE *stream);
|
||||||
WXDLLIMPEXP_BASE int wxMSLU__wrename(const wchar_t *oldname, const wchar_t *newname);
|
WXDLLIMPEXP_BASE int wxMSLU__wrename(const wchar_t *oldname, const wchar_t *newname);
|
||||||
@@ -575,7 +590,7 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name);
|
|||||||
#define wxCRT_AtolW watol
|
#define wxCRT_AtolW watol
|
||||||
/* else: use ANSI versions */
|
/* else: use ANSI versions */
|
||||||
#endif
|
#endif
|
||||||
#elif defined(wxHAVE_TCHAR_SUPPORT) && !defined(__STRICT_ANSI__)
|
#elif defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__)
|
||||||
#define wxCRT_AtoiW _wtoi
|
#define wxCRT_AtoiW _wtoi
|
||||||
#define wxCRT_AtolW _wtol
|
#define wxCRT_AtolW _wtol
|
||||||
/* _wtof doesn't exist */
|
/* _wtof doesn't exist */
|
||||||
|
Reference in New Issue
Block a user