FGx  1
 All Classes Files Functions Variables Enumerations Enumerator Macros Pages
compiler.h
Go to the documentation of this file.
1 /**************************************************************************
2  * compiler.h -- C++ Compiler Portability Macros
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * $Id$
19  *
20  **************************************************************************/
21 
31 #ifndef _SG_COMPILER_H
32 #define _SG_COMPILER_H
33 
34 /*
35  * Helper macro SG_STRINGIZE:
36  * Converts the parameter X to a string after macro replacement
37  * on X has been performed.
38  */
39 #define SG_STRINGIZE(X) SG_DO_STRINGIZE(X)
40 #define SG_DO_STRINGIZE(X) #X
41 
42 #ifdef __GNUC__
43 # if __GNUC__ < 3
44 # error Time to upgrade. GNU compilers < 3.0 not supported
45 # elif (__GNUC__ == 3) && (__GNUC_MINOR__ < 4)
46 # warning GCC compilers prior to 3.4 are suspect
47 # endif
48 
49 # define SG_COMPILER_STR "GNU C++ version " SG_STRINGIZE(__GNUC__) "." SG_STRINGIZE(__GNUC_MINOR__)
50 #endif // __GNUC__
51 
52 /* KAI C++ */
53 #if defined(__KCC)
54 # define SG_COMPILER_STR "Kai C++ version " SG_STRINGIZE(__KCC_VERSION)
55 #endif // __KCC
56 
57 //
58 // Microsoft compilers.
59 //
60 #ifdef _MSC_VER
61 # define bcopy(from, to, n) memcpy(to, from, n)
62 
63 # if _MSC_VER >= 1200 // msvc++ 6.0 or greater
64 # define isnan _isnan
65 # define snprintf _snprintf
66 # if _MSC_VER < 1500
67 # define vsnprintf _vsnprintf
68 # endif
69 # define copysign _copysign
70 # define strcasecmp stricmp
71 
72 # undef min
73 # undef max
74 
75 # pragma warning(disable: 4786) // identifier was truncated to '255' characters
76 # pragma warning(disable: 4244) // conversion from double to float
77 # pragma warning(disable: 4305) //
78 
79 # else
80 # error What version of MSVC++ is this?
81 # endif
82 
83 # define SG_COMPILER_STR "Microsoft Visual C++ version " SG_STRINGIZE(_MSC_VER)
84 
85 #endif // _MSC_VER
86 
87 //
88 // Native SGI compilers
89 //
90 
91 #if defined ( sgi ) && !defined( __GNUC__ )
92 # if (_COMPILER_VERSION < 740)
93 # error Need MipsPro 7.4.0 or higher now
94 # endif
95 
96 #define SG_HAVE_NATIVE_SGI_COMPILERS
97 
98 #pragma set woff 1001,1012,1014,1116,1155,1172,1174
99 #pragma set woff 1401,1460,1551,1552,1681
100 
101 #ifdef __cplusplus
102 # pragma set woff 1682,3303
103 # pragma set woff 3624
104 #endif
105 
106 # define SG_COMPILER_STR "SGI MipsPro compiler version " SG_STRINGIZE(_COMPILER_VERSION)
107 
108 #endif // Native SGI compilers
109 
110 
111 #if defined (__sun)
112 # define SG_UNIX
113 # include <strings.h>
114 # include <memory.h>
115 # if defined ( __cplusplus )
116  // typedef unsigned int size_t;
117  extern "C" {
118  extern void *memmove(void *, const void *, size_t);
119  }
120 # else
121  extern void *memmove(void *, const void *, size_t);
122 # endif // __cplusplus
123 
124 # if !defined( __GNUC__ )
125 # define SG_COMPILER_STR "Sun compiler version " SG_STRINGIZE(__SUNPRO_CC)
126 # endif
127 
128 #endif // sun
129 
130 //
131 // Intel C++ Compiler
132 //
133 #if defined(__ICC) || defined (__ECC)
134 # define SG_COMPILER_STR "Intel C++ version " SG_STRINGIZE(__ICC)
135 #endif // __ICC
136 
137 //
138 // Platform dependent gl.h and glut.h definitions
139 //
140 
141 #ifdef __APPLE__
142 # define SG_MAC
143 # define SG_UNIX
144 # ifdef __GNUC__
145 # if ( __GNUC__ > 3 ) || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 3 )
146 inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
147 # else
148  // any C++ header file undefines isinf and isnan
149  // so this should be included before <iostream>
150  // the functions are STILL in libm (libSystem on mac os x)
151 extern "C" int (isnan)(double);
152 extern "C" int (isinf)(double);
153 # endif
154 # else
155 inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
156 # endif
157 #endif
158 
159 #if defined (__FreeBSD__)
160 # define SG_UNIX
161 #include <sys/param.h>
162 # if __FreeBSD_version < 500000
163  extern "C" {
164  inline int isnan(double r) { return !(r <= 0 || r >= 0); }
165  }
166 # endif
167 #endif
168 
169 #if defined (__CYGWIN__)
170 # define SG_WINDOWS
171 # define SG_UNIX
172 # include <ieeefp.h> // isnan
173 #endif
174 
175 // includes both MSVC and mingw compilers
176 #if defined(_WIN32) || defined(__WIN32__)
177 # define SG_WINDOWS
178 #endif
179 
180 #if defined(__linux__) || defined(_AIX) || defined ( sgi )
181 # define SG_UNIX
182 #endif
183 
184 //
185 // No user modifiable definitions beyond here.
186 //
187 
188 #endif // _SG_COMPILER_H
189