Commit 8235ea1c authored by Mark Hammond's avatar Mark Hammond

Land Patch [ 566100 ] Rationalize DL_IMPORT and DL_EXPORT.

parent b8816981
...@@ -212,7 +212,7 @@ and initialize it in your module's initialization function ...@@ -212,7 +212,7 @@ and initialize it in your module's initialization function
the error checking for now): the error checking for now):
\begin{verbatim} \begin{verbatim}
void PyMODINIT_FUNC
initspam(void) initspam(void)
{ {
PyObject *m; PyObject *m;
...@@ -240,6 +240,7 @@ discarded, causing \cdata{SpamError} to become a dangling pointer. ...@@ -240,6 +240,7 @@ discarded, causing \cdata{SpamError} to become a dangling pointer.
Should it become a dangling pointer, C code which raises the exception Should it become a dangling pointer, C code which raises the exception
could cause a core dump or other unintended side effects. could cause a core dump or other unintended side effects.
We discuss the use of PyMODINIT_FUNC later in this sample.
\section{Back to the Example \section{Back to the Example
\label{backToExample}} \label{backToExample}}
...@@ -339,14 +340,16 @@ module, and should be the only non-\keyword{static} item defined in ...@@ -339,14 +340,16 @@ module, and should be the only non-\keyword{static} item defined in
the module file: the module file:
\begin{verbatim} \begin{verbatim}
void PyMODINIT_FUNC
initspam(void) initspam(void)
{ {
(void) Py_InitModule("spam", SpamMethods); (void) Py_InitModule("spam", SpamMethods);
} }
\end{verbatim} \end{verbatim}
Note that for \Cpp, this method must be declared \code{extern "C"}. Note that PyMODINIT_FUNC declares the function as \code{void} return type,
declares any special linkage declarations required by the platform, and for
\Cpp declares the function as \code{extern "C"}.
When the Python program imports module \module{spam} for the first When the Python program imports module \module{spam} for the first
time, \cfunction{initspam()} is called. (See below for comments about time, \cfunction{initspam()} is called. (See below for comments about
...@@ -1263,7 +1266,7 @@ the module's initialization function must take care of initializing ...@@ -1263,7 +1266,7 @@ the module's initialization function must take care of initializing
the C API pointer array: the C API pointer array:
\begin{verbatim} \begin{verbatim}
void PyMODINIT_FUNC
initspam(void) initspam(void)
{ {
PyObject *m; PyObject *m;
...@@ -1352,7 +1355,7 @@ rather macro) \cfunction{import_spam()} in its initialization ...@@ -1352,7 +1355,7 @@ rather macro) \cfunction{import_spam()} in its initialization
function: function:
\begin{verbatim} \begin{verbatim}
void PyMODINIT_FUNC
initclient(void) initclient(void)
{ {
PyObject *m; PyObject *m;
......
...@@ -7,32 +7,32 @@ ...@@ -7,32 +7,32 @@
extern "C" { extern "C" {
#endif #endif
DL_IMPORT(long) PyImport_GetMagicNumber(void); PyAPI_FUNC(long) PyImport_GetMagicNumber(void);
DL_IMPORT(PyObject *) PyImport_ExecCodeModule(char *name, PyObject *co); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule(char *name, PyObject *co);
DL_IMPORT(PyObject *) PyImport_ExecCodeModuleEx( PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx(
char *name, PyObject *co, char *pathname); char *name, PyObject *co, char *pathname);
DL_IMPORT(PyObject *) PyImport_GetModuleDict(void); PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void);
DL_IMPORT(PyObject *) PyImport_AddModule(char *name); PyAPI_FUNC(PyObject *) PyImport_AddModule(char *name);
DL_IMPORT(PyObject *) PyImport_ImportModule(char *name); PyAPI_FUNC(PyObject *) PyImport_ImportModule(char *name);
DL_IMPORT(PyObject *) PyImport_ImportModuleEx( PyAPI_FUNC(PyObject *) PyImport_ImportModuleEx(
char *name, PyObject *globals, PyObject *locals, PyObject *fromlist); char *name, PyObject *globals, PyObject *locals, PyObject *fromlist);
DL_IMPORT(PyObject *) PyImport_Import(PyObject *name); PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name);
DL_IMPORT(PyObject *) PyImport_ReloadModule(PyObject *m); PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m);
DL_IMPORT(void) PyImport_Cleanup(void); PyAPI_FUNC(void) PyImport_Cleanup(void);
DL_IMPORT(int) PyImport_ImportFrozenModule(char *); PyAPI_FUNC(int) PyImport_ImportFrozenModule(char *);
extern DL_IMPORT(PyObject *)_PyImport_FindExtension(char *, char *); extern PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *);
extern DL_IMPORT(PyObject *)_PyImport_FixupExtension(char *, char *); extern PyAPI_FUNC(PyObject *)_PyImport_FixupExtension(char *, char *);
struct _inittab { struct _inittab {
char *name; char *name;
void (*initfunc)(void); void (*initfunc)(void);
}; };
extern DL_IMPORT(struct _inittab *) PyImport_Inittab; extern PyAPI_DATA(struct _inittab *) PyImport_Inittab;
extern DL_IMPORT(int) PyImport_AppendInittab(char *name, void (*initfunc)(void)); extern PyAPI_FUNC(int) PyImport_AppendInittab(char *name, void (*initfunc)(void));
extern DL_IMPORT(int) PyImport_ExtendInittab(struct _inittab *newtab); extern PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab);
struct _frozen { struct _frozen {
char *name; char *name;
...@@ -43,7 +43,7 @@ struct _frozen { ...@@ -43,7 +43,7 @@ struct _frozen {
/* Embedding apps may change this pointer to point to their favorite /* Embedding apps may change this pointer to point to their favorite
collection of frozen modules: */ collection of frozen modules: */
extern DL_IMPORT(struct _frozen *) PyImport_FrozenModules; extern PyAPI_DATA(struct _frozen *) PyImport_FrozenModules;
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -379,19 +379,82 @@ extern int fsync(int fd); ...@@ -379,19 +379,82 @@ extern int fsync(int fd);
extern double hypot(double, double); extern double hypot(double, double);
#endif #endif
#ifndef __CYGWIN__ /* Declarations for symbol visibility.
#ifndef DL_IMPORT /* declarations for DLL import */
#define DL_IMPORT(RTYPE) RTYPE PyAPI_FUNC(type): Declares a public Python API function and return type
#endif PyAPI_DATA(type): Declares public Python data and its type
#else /* __CYGWIN__ */ PyMODINIT_FUNC: A Python module init function. If these functions are
#ifdef USE_DL_IMPORT inside the Python core, they are private to the core.
#define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE If in an extension module, it may be declared with
#define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE external linkage depending on the platform.
#else /* !USE_DL_IMPORT */
#define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE As a number of platforms support/require "__declspec(dllimport/dllexport)",
#define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE we support a HAVE_DECLSPEC_DLL macro to save duplication.
#endif /* USE_DL_IMPORT */ */
#endif /* __CYGWIN__ */
/*
All windows ports, except cygwin, are handled in PC/pyconfig.h
BeOS is only other autoconf platform requiring special linkage handling
and both these use __declspec()
*/
#if defined(__CYGWIN__) || defined(__BEOS__)
# define HAVE_DECLSPEC_DLL
#endif
#if defined(Py_ENABLE_SHARED) /* only get special linkage if built as shared */
# if defined(HAVE_DECLSPEC_DLL)
# ifdef Py_BUILD_CORE
# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
# define PyAPI_DATA(RTYPE) __declspec(dllexport) RTYPE
/* module init functions inside the core need no external linkage */
# define PyMODINIT_FUNC void
# else /* Py_BUILD_CORE */
/* Building an extension module, or an embedded situation */
/* public Python functions and data are imported */
# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
# define PyAPI_DATA(RTYPE) __declspec(dllimport) RTYPE
/* module init functions outside the core must be exported */
# if defined(__cplusplus)
# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void
# else /* __cplusplus */
# define PyMODINIT_FUNC __declspec(dllexport) void
# endif /* __cplusplus */
# endif /* Py_BUILD_CORE */
# endif /* HAVE_DECLSPEC */
#endif /* Py_ENABLE_SHARED */
/* If no external linkage macros defined by now, create defaults */
#ifndef PyAPI_FUNC
# define PyAPI_FUNC(RTYPE) RTYPE
#endif
#ifndef PyAPI_DATA
# define PyAPI_DATA(RTYPE) RTYPE
#endif
#ifndef PyMODINIT_FUNC
# if defined(__cplusplus)
# define PyMODINIT_FUNC extern "C" void
# else /* __cplusplus */
# define PyMODINIT_FUNC void
# endif /* __cplusplus */
#endif
/* Deprecated DL_IMPORT and DL_EXPORT macros */
#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL)
# if defined(Py_BUILD_CORE)
# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
# else
# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
# endif
#endif
#ifndef DL_EXPORT
# define DL_EXPORT(RTYPE) RTYPE
#endif
#ifndef DL_IMPORT
# define DL_IMPORT(RTYPE) RTYPE
#endif
/* End of deprecated DL_* macros */
/* If the fd manipulation macros aren't defined, /* If the fd manipulation macros aren't defined,
here is a set that should do the job */ here is a set that should do the job */
...@@ -458,15 +521,6 @@ typedef struct fd_set { ...@@ -458,15 +521,6 @@ typedef struct fd_set {
#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
#endif #endif
/*
* Rename some functions for the Borland compiler
*/
#ifdef __BORLANDC__
# include <io.h>
# define _chsize chsize
# define _setmode setmode
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -65,7 +65,7 @@ LINKFORSHARED= @LINKFORSHARED@ ...@@ -65,7 +65,7 @@ LINKFORSHARED= @LINKFORSHARED@
# Extra C flags added for building the interpreter object files. # Extra C flags added for building the interpreter object files.
CFLAGSFORSHARED=@CFLAGSFORSHARED@ CFLAGSFORSHARED=@CFLAGSFORSHARED@
# C flags used for building the interpreter object files # C flags used for building the interpreter object files
PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
# Machine-dependent subdirectories # Machine-dependent subdirectories
...@@ -420,10 +420,10 @@ Parser/metagrammar.o: $(srcdir)/Parser/metagrammar.c ...@@ -420,10 +420,10 @@ Parser/metagrammar.o: $(srcdir)/Parser/metagrammar.c
Python/compile.o Python/symtable.o: $(GRAMMAR_H) Python/compile.o Python/symtable.o: $(GRAMMAR_H)
Python/getplatform.o: $(srcdir)/Python/getplatform.c Python/getplatform.o: $(srcdir)/Python/getplatform.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c
Python/importdl.o: $(srcdir)/Python/importdl.c Python/importdl.o: $(srcdir)/Python/importdl.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c $(CC) -c $(PY_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
Objects/unicodectype.o: $(srcdir)/Objects/unicodectype.c \ Objects/unicodectype.o: $(srcdir)/Objects/unicodectype.c \
$(srcdir)/Objects/unicodetype_db.h $(srcdir)/Objects/unicodetype_db.h
......
...@@ -2979,8 +2979,7 @@ static PyMethodDef _functions[] = { ...@@ -2979,8 +2979,7 @@ static PyMethodDef _functions[] = {
{NULL, NULL} {NULL, NULL}
}; };
DL_EXPORT(void) PyMODINIT_FUNC init_sre(void)
init_sre(void)
{ {
PyObject* m; PyObject* m;
PyObject* d; PyObject* d;
......
...@@ -1583,10 +1583,9 @@ get_version_string(void) ...@@ -1583,10 +1583,9 @@ get_version_string(void)
#define MODULE_INITFUNC initpyexpat #define MODULE_INITFUNC initpyexpat
#endif #endif
void MODULE_INITFUNC(void); /* avoid compiler warnings */ PyMODINIT_FUNC MODULE_INITFUNC(void); /* avoid compiler warnings */
DL_EXPORT(void) PyMODINIT_FUNC MODULE_INITFUNC(void)
MODULE_INITFUNC(void)
{ {
PyObject *m, *d; PyObject *m, *d;
PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors"); PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors");
......
...@@ -1423,7 +1423,7 @@ inskey(PyObject * d, char * name, HKEY key) ...@@ -1423,7 +1423,7 @@ inskey(PyObject * d, char * name, HKEY key)
#define ADD_KEY(val) inskey(d, #val, val) #define ADD_KEY(val) inskey(d, #val, val)
__declspec(dllexport) void init_winreg(void) PyMODINIT_FUNC init_winreg(void)
{ {
PyObject *m, *d; PyObject *m, *d;
m = Py_InitModule3("_winreg", winreg_methods, module_doc); m = Py_InitModule3("_winreg", winreg_methods, module_doc);
......
This diff is collapsed.
...@@ -7,11 +7,6 @@ ...@@ -7,11 +7,6 @@
#include "Python.h" #include "Python.h"
/* pyconfig.h may or may not define DL_IMPORT */
#ifndef DL_IMPORT /* declarations for DLL import/export */
#define DL_IMPORT(RTYPE) RTYPE
#endif
#ifndef DONT_HAVE_STDIO_H #ifndef DONT_HAVE_STDIO_H
#include <stdio.h> #include <stdio.h>
#endif #endif
......
#! /bin/sh #! /bin/sh
# From configure.in Revision: 1.330 . # From configure.in Revision: 1.332 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.53. # Generated by GNU Autoconf 2.53.
# #
...@@ -1225,6 +1225,7 @@ VERSION=2.3 ...@@ -1225,6 +1225,7 @@ VERSION=2.3
SOVERSION=1.0 SOVERSION=1.0
cat >>confdefs.h <<\_ACEOF cat >>confdefs.h <<\_ACEOF
#define _XOPEN_SOURCE 500 #define _XOPEN_SOURCE 500
_ACEOF _ACEOF
...@@ -1347,8 +1348,7 @@ else ...@@ -1347,8 +1348,7 @@ else
ppc) ppc)
CC=mwcc CC=mwcc
without_gcc=yes without_gcc=yes
OPT="-O -D'DL_EXPORT(RTYPE)=__declspec(dllexport) RTYPE' -D'DL_IMPORT(RTYPE)=__declspec(dllexport) RTYPE' -export pragma" OPT="-O -export pragma"
CCSHARED="-UDL_IMPORT -D'DL_IMPORT(RTYPE)=__declspec(dllimport) RTYPE'"
LDFLAGS="$LDFLAGS -nodup" LDFLAGS="$LDFLAGS -nodup"
;; ;;
x86) x86)
...@@ -3107,6 +3107,11 @@ fi ...@@ -3107,6 +3107,11 @@ fi
# Other platforms follow # Other platforms follow
if test $enable_shared = "yes"; then if test $enable_shared = "yes"; then
cat >>confdefs.h <<\_ACEOF
#define Py_ENABLE_SHARED 1
_ACEOF
case $ac_sys_system in case $ac_sys_system in
BeOS*) BeOS*)
LDLIBRARY='libpython$(VERSION).so' LDLIBRARY='libpython$(VERSION).so'
...@@ -8820,7 +8825,6 @@ then ...@@ -8820,7 +8825,6 @@ then
*gcc*) CCSHARED="-shared";; *gcc*) CCSHARED="-shared";;
*) CCSHARED="";; *) CCSHARED="";;
esac;; esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
atheos*) CCSHARED="-fPIC";; atheos*) CCSHARED="-fPIC";;
esac esac
fi fi
......
...@@ -125,8 +125,7 @@ AC_ARG_WITH(gcc, [ --without-gcc never use gcc], [ ...@@ -125,8 +125,7 @@ AC_ARG_WITH(gcc, [ --without-gcc never use gcc], [
ppc) ppc)
CC=mwcc CC=mwcc
without_gcc=yes without_gcc=yes
OPT="-O -D'DL_EXPORT(RTYPE)=__declspec(dllexport) RTYPE' -D'DL_IMPORT(RTYPE)=__declspec(dllexport) RTYPE' -export pragma" OPT="-O -export pragma"
CCSHARED="-UDL_IMPORT -D'DL_IMPORT(RTYPE)=__declspec(dllimport) RTYPE'"
LDFLAGS="$LDFLAGS -nodup" LDFLAGS="$LDFLAGS -nodup"
;; ;;
x86) x86)
...@@ -359,6 +358,7 @@ fi ...@@ -359,6 +358,7 @@ fi
# Other platforms follow # Other platforms follow
if test $enable_shared = "yes"; then if test $enable_shared = "yes"; then
AC_DEFINE(Py_ENABLE_SHARED, 1, [Defined if Python is built as a shared library.])
case $ac_sys_system in case $ac_sys_system in
BeOS*) BeOS*)
LDLIBRARY='libpython$(VERSION).so' LDLIBRARY='libpython$(VERSION).so'
...@@ -948,7 +948,6 @@ then ...@@ -948,7 +948,6 @@ then
*gcc*) CCSHARED="-shared";; *gcc*) CCSHARED="-shared";;
*) CCSHARED="";; *) CCSHARED="";;
esac;; esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
atheos*) CCSHARED="-fPIC";; atheos*) CCSHARED="-fPIC";;
esac esac
fi fi
......
...@@ -11,10 +11,6 @@ ...@@ -11,10 +11,6 @@
on SGI IRIX 4.x) */ on SGI IRIX 4.x) */
#undef BAD_EXEC_PROTOTYPES #undef BAD_EXEC_PROTOTYPES
/* Define if your compiler botches static forward declarations (as it does on
SCI ODT 3.0) */
#undef BAD_STATIC_FORWARD
/* Define this if you have BeOS threads. */ /* Define this if you have BeOS threads. */
#undef BEOS_THREADS #undef BEOS_THREADS
...@@ -128,9 +124,6 @@ ...@@ -128,9 +124,6 @@
/* Define to 1 if you have the `gai_strerror' function. */ /* Define to 1 if you have the `gai_strerror' function. */
#undef HAVE_GAI_STRERROR #undef HAVE_GAI_STRERROR
/* Define to 1 if you have the <gdbm/ndbm.h> header file. */
#undef HAVE_GDBM_NDBM_H
/* Define if you have the getaddrinfo function. */ /* Define if you have the getaddrinfo function. */
#undef HAVE_GETADDRINFO #undef HAVE_GETADDRINFO
...@@ -272,9 +265,6 @@ ...@@ -272,9 +265,6 @@
/* Define to 1 if you have the <ncurses.h> header file. */ /* Define to 1 if you have the <ncurses.h> header file. */
#undef HAVE_NCURSES_H #undef HAVE_NCURSES_H
/* Define to 1 if you have the <ndbm.h> header file. */
#undef HAVE_NDBM_H
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ /* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
#undef HAVE_NDIR_H #undef HAVE_NDIR_H
...@@ -353,9 +343,6 @@ ...@@ -353,9 +343,6 @@
/* Define to 1 if you have the `setpgid' function. */ /* Define to 1 if you have the `setpgid' function. */
#undef HAVE_SETPGID #undef HAVE_SETPGID
/* Define to 1 if you have the `setpgrp' function. */
#undef HAVE_SETPGRP
/* Define to 1 if you have the `setregid' function. */ /* Define to 1 if you have the `setregid' function. */
#undef HAVE_SETREGID #undef HAVE_SETREGID
...@@ -626,6 +613,9 @@ ...@@ -626,6 +613,9 @@
/* Define if you want to build an interpreter with many run-time checks. */ /* Define if you want to build an interpreter with many run-time checks. */
#undef Py_DEBUG #undef Py_DEBUG
/* Defined if Python is built as a shared library. */
#undef Py_ENABLE_SHARED
/* Define as the size of the unicode type. */ /* Define as the size of the unicode type. */
#undef Py_UNICODE_SIZE #undef Py_UNICODE_SIZE
...@@ -638,6 +628,9 @@ ...@@ -638,6 +628,9 @@
/* Define if setpgrp() must be called as setpgrp(0, 0). */ /* Define if setpgrp() must be called as setpgrp(0, 0). */
#undef SETPGRP_HAVE_ARG #undef SETPGRP_HAVE_ARG
/* Define to 1 if the `setpgrp' function takes no argument. */
#undef SETPGRP_VOID
/* Define if i>>j for signed int i does not extend the sign bit when i < 0 */ /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
#undef SIGNED_RIGHT_SHIFT_ZERO_FILLS #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS
...@@ -712,9 +705,6 @@ ...@@ -712,9 +705,6 @@
/* Define if WINDOW in curses.h offers a field _flags. */ /* Define if WINDOW in curses.h offers a field _flags. */
#undef WINDOW_HAS_FLAGS #undef WINDOW_HAS_FLAGS
/* Define if you want to compile in cycle garbage collection. */
#undef WITH_CYCLE_GC
/* Define if you want to emulate SGI (IRIX 4) dynamic linking. This is /* Define if you want to emulate SGI (IRIX 4) dynamic linking. This is
rumoured to work on VAX (Ultrix), Sun3 (SunOS 3.4), Sequent Symmetry rumoured to work on VAX (Ultrix), Sun3 (SunOS 3.4), Sequent Symmetry
(Dynix), and Atari ST. This requires the 'dl-dld' library, (Dynix), and Atari ST. This requires the 'dl-dld' library,
...@@ -783,6 +773,9 @@ ...@@ -783,6 +773,9 @@
/* Define to force use of thread-safe errno, h_errno, and other functions */ /* Define to force use of thread-safe errno, h_errno, and other functions */
#undef _REENTRANT #undef _REENTRANT
/* Needed on Tru64 and does no harm on Linux */
#undef _XOPEN_SOURCE
/* Define to 1 if type `char' is unsigned and you are not using gcc. */ /* Define to 1 if type `char' is unsigned and you are not using gcc. */
#ifndef __CHAR_UNSIGNED__ #ifndef __CHAR_UNSIGNED__
# undef __CHAR_UNSIGNED__ # undef __CHAR_UNSIGNED__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment