-#ifndef _COMPILER_H
-#define _COMPILER_H
-
-// What this file does.
-// (1) Defines macros for some STL includes which may be affected
-// by file name length limitations.
-// (2) Defines macros for some features not supported by all C++ compilers.
-// (3) Defines 'explicit' as a null macro if the compiler doesn't support
-// the explicit keyword.
-// (4) Defines 'typename' as a null macro if the compiler doesn't support
-// the typename keyword.
-// (5) Defines bool, true and false if the compiler doesn't do so.
-// (6) Defines FG_EXPLICIT_FUNCTION_TMPL_ARGS if the compiler
-// supports calling a function template by providing its template
-// arguments explicitly.
-// (7) Defines FG_NEED_AUTO_PTR if STL doesn't provide auto_ptr<>.
-// (8) Defines FG_NO_ARROW_OPERATOR if the compiler is unable
-// to support operator->() for iterators.
-// (9) Defines FG_USE_EXCEPTIONS if the compiler supports exceptions.
-// Note: no FlightGear code uses exceptions.
-// (10) Define FG_NAMESPACES if the compiler supports namespaces.
-// (11) FG_MATH_FN_IN_NAMESPACE_STD -- not used??
-// (12) Define FG_HAVE_STD if std namespace is supported.
-// (13) Defines FG_CLASS_PARTIAL_SPECIALIZATION if the compiler
-// supports partial specialization of class templates.
-// (14) Defines FG_HAVE_STD_INCLUDES to use ISO C++ Standard headers.
-// (15) Defines FG_HAVE_STREAMBUF if <streambuf> of <streambuf.h> are present.
-// (16) Define FG_MATH_EXCEPTION_CLASH if math.h defines an exception class
-// that clashes with the one defined in <stdexcept>.
+/** \file compiler.h
+ * A set of defines to encapsulate compiler and platform differences.
+ * Please refer to the source code for full documentation on this file.
+ *
+ * Here is a summary of what this file does.
+ *
+ * (1) Defines macros for some STL includes which may be affected
+ * by file name length limitations.
+ *
+ * (2) Defines macros for some features not supported by all C++ compilers.
+ *
+ * (3) Defines 'explicit' as a null macro if the compiler doesn't support
+ * the explicit keyword.
+ *
+ * (4) Defines 'typename' as a null macro if the compiler doesn't support
+ * the typename keyword.
+ *
+ * (5) Defines bool, true and false if the compiler doesn't do so.
+ *
+ * (6) Defines SG_EXPLICIT_FUNCTION_TMPL_ARGS if the compiler
+ * supports calling a function template by providing its template
+ * arguments explicitly.
+ *
+ * (7) Defines SG_NEED_AUTO_PTR if STL doesn't provide auto_ptr<>.
+ *
+ * (8) Defines SG_NO_ARROW_OPERATOR if the compiler is unable
+ * to support operator->() for iterators.
+ *
+ * (9) Defines SG_USE_EXCEPTIONS if the compiler supports exceptions.
+ * Note: no FlightGear code uses exceptions.
+ *
+ * (10) Define SG_NAMESPACES if the compiler supports namespaces.
+ *
+ * (11) SG_MATH_FN_IN_NAMESPACE_STD -- not used??
+ *
+ * (12) Define SG_HAVE_STD if std namespace is supported.
+ *
+ * (13) Defines SG_CLASS_PARTIAL_SPECIALIZATION if the compiler
+ * supports partial specialization of class templates.
+ *
+ * (14) Defines SG_HAVE_STD_INCLUDES to use ISO C++ Standard headers.
+ *
+ * (15) Defines SG_HAVE_STREAMBUF if <streambuf> of <streambuf.h> are present.
+ *
+ * (16) Define SG_MATH_EXCEPTION_CLASH if math.h defines an exception class
+ * that clashes with the one defined in <stdexcept>.
+ */
+
+#ifndef _SG_COMPILER_H
+#define _SG_COMPILER_H
+
+/*
+ * Helper macro SG_STRINGIZE:
+ * Converts the parameter X to a string after macro replacement
+ * on X has been performed.
+ */
+#define SG_STRINGIZE(X) SG_DO_STRINGIZE(X)
+#define SG_DO_STRINGIZE(X) #X