Split c++11-compat.h's compiler-specific defines into separate files.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Fri, 4 Sep 2015 00:19:09 +0000 (20:19 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Fri, 4 Sep 2015 00:19:09 +0000 (20:19 -0400)
c++11-compat.gcc.h: gcc
c++11-compat.msvc.h: MSVC

Note that although clang and icc define __GNUC__ (at least on Linux),
their emulated gcc version numbers is entirely made up, and they don't
correspond to the C++ 2011 implementation.

src/c++11-compat.gcc.h [new file with mode: 0644]
src/c++11-compat.h
src/c++11-compat.msvc.h

diff --git a/src/c++11-compat.gcc.h b/src/c++11-compat.gcc.h
new file mode 100644 (file)
index 0000000..5078b31
--- /dev/null
@@ -0,0 +1,69 @@
+/***************************************************************************
+ * c++11-compat.gcc.h: C++ 2011 compatibility header. (gcc)                *
+ *                                                                         *
+ * Copyright (c) 2011-2015 by David Korth.                                 *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU General Public License as published by the   *
+ * Free Software Foundation; either version 2 of the License, or (at your  *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of              *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.           *
+ ***************************************************************************/
+
+#ifndef __CXX11_COMPAT_GCC_H__
+#define __CXX11_COMPAT_GCC_H__
+
+#if !defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
+#error c++11-compat.gcc.h should only be included in gcc builds.
+#endif
+
+/** C++ 2011 **/
+
+#ifdef __cplusplus
+
+/**
+ * Enable compatibility for C++ 2011 features that aren't
+ * present in older versions of gcc.
+ *
+ * These are all automatically enabled when compiling C code.
+ */
+
+/* For gcc-4.7+, make sure we're compiling with -std=c++11 or -std=gnu++11. */
+/* Older versions didn't set the correct value for __cplusplus. */
+#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
+#if __cplusplus < 201103L
+#error Please compile with -std=c++11 or -std=gnu++11.
+#endif /* __cplusplus */
+#endif /* __GNUC__ */
+
+/* Explicit virtual override: Added in gcc-4.7. */
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))
+#define CXX11_COMPAT_OVERRIDE
+#endif
+
+/* nullptr: Added in gcc-4.6 */
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
+#define CXX11_COMPAT_NULLPTR
+#endif
+
+/* New character types: Added in gcc-4.4 */
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+#define CXX11_COMPAT_CHARTYPES
+#endif
+
+/* Static assertions: Added in gcc-4.3 (first version to support C++11) */
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3))
+#define CXX11_COMPAT_STATIC_ASSERT
+#endif
+
+#endif /* __cplusplus */
+
+#endif /* __CXX11_COMPAT_GCC_H__ */
index 639c20e..50bef17 100644 (file)
@@ -21,8 +21,7 @@
 #ifndef __CXX11_COMPAT_H__
 #define __CXX11_COMPAT_H__
 
-#if !defined(__cplusplus)
-
+#ifndef __cplusplus
 /**
  * We're compiling C code.
  * Provide replacements for C++ 2011 functionality.
 #define CXX11_COMPAT_OVERRIDE
 #define CXX11_COMPAT_CHARTYPES
 #define CXX11_COMPAT_STATIC_ASSERT
+#endif /* !__cplusplus */
 
-#else
+/** Compiler-specific headers. **/
 
 #if defined(__GNUC__)
-
-/* Some versions of gcc implement parts of C++11, but not all of it. */
-
-/* For gcc-4.7+, make sure we're compiling with -std=c++11 or -std=gnu++11. */
-/* Older versions didn't set the correct value for __cplusplus. */
-#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
-#if __cplusplus < 201103L
-#error Please compile with -std=c++11 or -std=gnu++11.
-#endif /* __cplusplus */
-#endif /* __GNUC__ */
-
-/* Explicit virtual override: Added in gcc-4.7. */
-#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))
-#define CXX11_COMPAT_OVERRIDE
-#endif
-
-/* nullptr: Added in gcc-4.6 */
-#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
-#define CXX11_COMPAT_NULLPTR
-#endif
-
-/* New character types: Added in gcc-4.4 */
-#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
-#define CXX11_COMPAT_CHARTYPES
-#endif
-
-/* Static assertions: Added in gcc-4.3 (first version to support C++11) */
-#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3))
-#define CXX11_COMPAT_STATIC_ASSERT
-#endif
-
+#include "c++11-compat.gcc.h"
 #elif defined(_MSC_VER)
-
-#if (_MSC_VER < 1900)
-/**
- * MSVC 2015 (14.0) added support for Unicode character types.
- * (char16_t, char32_t, related string types)
- */
-#define CXX11_COMPAT_CHARTYPES
-#endif
-
-#if (_MSC_VER < 1700)
-/**
- * MSVC 2010 (10.0) does support override, but not final.
- * However, it has a "sealed" keyword that works almost
- * the same way as final.
- */
-#define final sealed
-#endif
-
-#if (_MSC_VER < 1600)
-/**
- * MSVC 2008 (9.0) and older: No C++ 2011 support at all.
- * Probably won't compile at all due to lack of stdint.h.
- */
-#define CXX11_COMPAT_NULLPTR
-#define CXX11_COMPAT_OVERRIDE
-#define CXX11_COMPAT_STATIC_ASSERT
-#endif
-
-#endif /* compiler-specific */
-
+#include "c++11-compat.msvc.h"
+#else
+#error Unknown compiler, please update c++11-compat.h.
 #endif
 
 /* nullptr: Represents a NULL pointer. NULL == 0 */
@@ -116,7 +59,6 @@ typedef uint16_t char16_t;
 typedef uint32_t char32_t;
 
 #ifdef __cplusplus
-
 #include <string>
 namespace std {
        typedef basic_string<char16_t> u16string;
@@ -145,20 +87,4 @@ namespace std {
 # endif
 #endif
 
-/**
- * Older versions of MSVC aren't C99-compliant, but they
- * do have equivalent functions with different names.
- */
-#ifdef _MSC_VER
-#include "msvc-c99-compat.h"
-#endif
-
-/**
- * MSVC doesn't have typeof(), but as of MSVC 2010,
- * it has decltype(), which is essentially the same thing.
- */
-#ifdef _MSC_VER
-#define typeof(x) decltype(x)
-#endif
-
 #endif /* __CXX11_COMPAT_H__ */
index 92de31b..6c02c98 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- * msvc-c99-compat.h: MSVC C99 compatibility header.                       *
+ * c++11-compat.msvc.h: C++ 2011 compatibility header. (MSVC)              *
  *                                                                         *
  * Copyright (c) 2011-2015 by David Korth.                                 *
  *                                                                         *
  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.           *
  ***************************************************************************/
 
-#ifndef __MSVC_C99_COMPAT_H__
-#define __MSVC_C99_COMPAT_H__
+#ifndef __CXX11_COMPAT_MSVC_H__
+#define __CXX11_COMPAT_MSVC_H__
+
+#ifndef _MSC_VER
+#error c++11-compat.msvc.h should only be included in MSVC builds.
+#endif
+
+/** C++ 2011 **/
+
+#ifdef __cplusplus
+
+/**
+ * Enable compatibility for C++ 2011 features that aren't
+ * present in older versions of MSVC.
+ *
+ * These are all automatically enabled when compiling C code.
+ */
+
+#if (_MSC_VER < 1900)
+/**
+ * MSVC 2015 (14.0) added support for Unicode character types.
+ * (char16_t, char32_t, related string types)
+ */
+#define CXX11_COMPAT_CHARTYPES
+#endif
+
+#if (_MSC_VER < 1700)
+/**
+ * MSVC 2010 (10.0) does support override, but not final.
+ * However, it has a "sealed" keyword that works almost
+ * the same way as final.
+ */
+#define final sealed
+#endif
+
+#if (_MSC_VER < 1600)
+/**
+ * MSVC 2008 (9.0) and older: No C++ 2011 support at all.
+ * Probably won't compile at all due to lack of stdint.h.
+ */
+#define CXX11_COMPAT_NULLPTR
+#define CXX11_COMPAT_OVERRIDE
+#define CXX11_COMPAT_STATIC_ASSERT
+#endif
+
+#endif /* __cplusplus */
+
+/** C99 **/
 
 /**
  * C library functions that have different names in MSVCRT
  * have added more C99 functionality, since C99 is included
  */
 
-#ifndef _MSC_VER
-#error msvc-c99-compat.h should only be included in MSVC builds.
-#endif
-
 /** snprintf(), vsnprintf() **/
 
 /**
 #define strtoull(nptr, endptr, base) _strtoui64(nptr, endptr, base)
 #endif /* _MSC_VER < 1800 */
 
+/**
+ * MSVC doesn't have typeof(), but as of MSVC 2010,
+ * it has decltype(), which is essentially the same thing.
+ * TODO: Handle older versions.
+ * Possible option for C++:
+ * - http://www.nedproductions.biz/blog/implementing-typeof-in-microsofts-c-compiler
+ */
+#define typeof(x) decltype(x)
+
 #endif /* __MSVC_C99_COMPAT_H__ */