0032402: Coding Rules - eliminate msvc warning C4668 (symbol is not defined as a...
[occt.git] / src / Standard / Standard_Macro.hxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 //! @file
16 //! This file is intended to be the first file included to any
17 //! Open CASCADE source. It defines platform-specific pre-processor 
18 //! macros necessary for correct compilation of Open CASCADE code.
19
20 #ifndef _Standard_Macro_HeaderFile
21 # define _Standard_Macro_HeaderFile
22
23 //! @def Standard_OVERRIDE
24 //! Should be used in declarations of virtual methods overridden in the
25 //! derived classes, to cause compilation error in the case if that virtual 
26 //! function disappears or changes its signature in the base class.
27 //!
28 //! Expands to C++11 keyword "override" on compilers that are known to
29 //! suppot it; empty in other cases.
30 #if defined(__cplusplus) && (__cplusplus >= 201100L)
31   // part of C++11 standard
32   #define Standard_OVERRIDE override
33 #elif defined(_MSC_VER) && (_MSC_VER >= 1700)
34   // MSVC extension since VS2012
35   #define Standard_OVERRIDE override
36 #else
37   #define Standard_OVERRIDE
38 #endif
39
40 //! @def Standard_FALLTHROUGH
41 //! Should be used in a switch statement immediately before a case label,
42 //! if code associated with the previous case label may fall through to that
43 //! next label (i.e. does not end with "break" or "return" etc.). 
44 //! This macro indicates that the fall through is intentional and should not be 
45 //! diagnosed by a compiler that warns on fallthrough.
46 //!
47 //! Expands to C++17 attribute statement "[[fallthrough]];" on compilers that 
48 //! declare support of C++17, or to "__attribute__((fallthrough));" on 
49 //! GCC 7+.
50 #if defined(__cplusplus) && (__cplusplus >= 201703L)
51   // part of C++17 standard
52   #define Standard_FALLTHROUGH [[fallthrough]];
53 #elif defined(__GNUC__) && (__GNUC__ >= 7)
54   // gcc 7+
55   #define Standard_FALLTHROUGH __attribute__((fallthrough));
56 #else
57   #define Standard_FALLTHROUGH
58 #endif
59
60 //! @def Standard_NODISCARD
61 //! This attribute may appear in a function declaration,
62 //! enumeration declaration or class declaration. It tells the compiler to
63 //! issue a warning, if a return value marked by that attribute is discarded.
64 //!
65 //! Expands to C++17 attribute statement "[[nodiscard]]" on compilers that
66 //! declare support of this attribute, or equivalent attribute on GCC.
67 #if defined(__has_cpp_attribute)
68   #if __has_cpp_attribute(nodiscard)
69     #define Standard_NODISCARD [[nodiscard]]
70   #else
71     #define Standard_NODISCARD
72   #endif
73 #elif defined(__GNUC__) && ! defined(INTEL_COMPILER)
74   // According to available documentation, GCC-style __attribute__ ((warn_unused_result))
75   // should be available in GCC since version 3.4, and in CLang since 3.9;
76   // Intel compiler does not seem to support this
77   #define Standard_NODISCARD __attribute__ ((warn_unused_result))
78 #else
79   #define Standard_NODISCARD
80 #endif
81
82 //! @def Standard_UNUSED
83 //! Macro for marking variables / functions as possibly unused
84 //! so that compiler will not emit redundant "unused" warnings.
85 //!
86 //! Expands to "__attribute__((unused))" on GCC and CLang.
87 #if defined(__GNUC__) || defined(__clang__)
88   #define Standard_UNUSED __attribute__((unused))
89 #else
90   #define Standard_UNUSED
91 #endif
92
93 //! @def Standard_NOINLINE
94 //! Macro for disallowing function inlining.
95 //! Expands to "__attribute__((noinline))" on GCC and CLang.
96 #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)))
97   #define Standard_NOINLINE __attribute__((noinline))
98 #elif defined(_MSC_VER)
99   #define Standard_NOINLINE __declspec(noinline)
100 #else
101   #define Standard_NOINLINE
102 #endif
103
104 //! @def Standard_THREADLOCAL
105 //! Define Standard_THREADLOCAL modifier as C++11 thread_local keyword where it is available.
106 #if defined(__clang__)
107   // CLang version: standard CLang > 3.3 or XCode >= 8 (but excluding 32-bit ARM)
108   // Note: this has to be in separate #if to avoid failure of preprocessor on other platforms
109   #if __has_feature(cxx_thread_local)
110     #define Standard_THREADLOCAL thread_local
111   #endif
112 #elif defined(__INTEL_COMPILER)
113   #if (defined(_MSC_VER) && _MSC_VER >= 1900 && __INTEL_COMPILER > 1400)
114     // requires msvcrt vc14+ (Visual Studio 2015+)
115     #define Standard_THREADLOCAL thread_local
116   #elif (!defined(_MSC_VER) && __INTEL_COMPILER > 1500)
117     #define Standard_THREADLOCAL thread_local
118   #endif
119 #elif (defined(_MSC_VER) && _MSC_VER >= 1900)
120   // msvcrt coming with vc14+ (VS2015+)
121   #define Standard_THREADLOCAL thread_local
122 #elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))
123   // GCC >= 4.8
124   #define Standard_THREADLOCAL thread_local
125 #endif
126
127 #ifndef Standard_THREADLOCAL
128   #define Standard_THREADLOCAL
129 #endif
130
131 //! @def Standard_DEPRECATED("message")
132 //! Can be used in declaration of a method or a class to mark it as deprecated.
133 //! Use of such method or class will cause compiler warning (if supported by 
134 //! compiler and unless disabled).
135 //! If macro OCCT_NO_DEPRECATED is defined, Standard_DEPRECATED is defined empty.
136 #ifdef OCCT_NO_DEPRECATED
137   #define Standard_DEPRECATED(theMsg)
138 #else
139 #if defined(_MSC_VER)
140   #define Standard_DEPRECATED(theMsg) __declspec(deprecated(theMsg))
141 #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || defined(__clang__))
142   #define Standard_DEPRECATED(theMsg) __attribute__((deprecated(theMsg)))
143 #elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
144   #define Standard_DEPRECATED(theMsg) __attribute__((deprecated))
145 #else
146   #define Standard_DEPRECATED(theMsg)
147 #endif
148 #endif
149
150 //! @def Standard_DISABLE_DEPRECATION_WARNINGS
151 //! Disables warnings on use of deprecated features (see Standard_DEPRECATED),
152 //! from the current point till appearance of Standard_ENABLE_DEPRECATION_WARNINGS macro.
153 //! This is useful for sections of code kept for backward compatibility and scheduled for removal.
154 //!
155 //! @def Standard_ENABLE_DEPRECATION_WARNINGS
156 //! Enables warnings on use of deprecated features previously disabled by
157 //! Standard_DISABLE_DEPRECATION_WARNINGS.
158 #if defined(__ICL) || defined (__INTEL_COMPILER)
159   #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478))
160   #define Standard_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
161 #elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) || defined(__clang__)
162   // available since at least gcc 4.2 (maybe earlier), however only gcc 4.6+ supports this pragma inside the function body
163   // CLang also supports this gcc syntax (in addition to "clang diagnostic ignored")
164   #define Standard_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
165   #define Standard_ENABLE_DEPRECATION_WARNINGS  _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"")
166 #elif defined(_MSC_VER)
167   #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996))
168   #define Standard_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
169 #else
170   #define Standard_DISABLE_DEPRECATION_WARNINGS
171   #define Standard_ENABLE_DEPRECATION_WARNINGS
172 #endif
173
174 //! @def OCCT_NO_RVALUE_REFERENCE
175 //! Disables methods and constructors that use rvalue references
176 //! (C++11 move semantics) not supported by obsolete compilers.
177 #if (defined(_MSC_VER) && (_MSC_VER < 1600))
178   #define OCCT_NO_RVALUE_REFERENCE
179 #endif
180
181 # ifdef _WIN32
182
183 // We must be careful including windows.h: it is really poisonous stuff!
184 // The most annoying are #defines of many identifiers that you could use in 
185 // normal code without knowing that Windows has its own knowledge of them...
186 // So lets protect ourselves by switching OFF as much as possible of this in advance.
187 // If someone needs more from windows.h, he is encouraged to #undef these symbols
188 // or include windows.h prior to any OCCT stuff.
189 // Note that we define each symbol to itself, so that it still can be used
190 // e.g. as name of variable, method etc.
191 #ifndef WIN32_LEAN_AND_MEAN
192 #define WIN32_LEAN_AND_MEAN   /* exclude extra Windows stuff */
193 #endif
194 #ifndef NOMINMAX
195 #define NOMINMAX NOMINMAX     /* avoid #define min() and max() */
196 #endif
197 #ifndef NOMSG
198 #define NOMSG NOMSG           /* avoid #define SendMessage etc. */
199 #endif
200 #ifndef NODRAWTEXT
201 #define NODRAWTEXT NODRAWTEXT /* avoid #define DrawText etc. */
202 #endif
203 #ifndef NONLS
204 #define NONLS NONLS           /* avoid #define CompareString etc. */
205 #endif
206 #ifndef NOGDI
207 #define NOGDI NOGDI           /* avoid #define SetPrinter (winspool.h) etc. */
208 #endif
209 #ifndef NOSERVICE
210 #define NOSERVICE NOSERVICE   
211 #endif
212 #ifndef NOKERNEL
213 #define NOKERNEL NOKERNEL
214 #endif
215 #ifndef NOUSER
216 #define NOUSER NOUSER
217 #endif
218 #ifndef NOMCX
219 #define NOMCX NOMCX
220 #endif
221 #ifndef NOIME
222 #define NOIME NOIME
223 #endif
224
225 #endif
226
227 //! @def Standard_EXPORT
228 //! This macro should be used in declarations of public methods 
229 //! to ensure that they are exported from DLL on Windows and thus
230 //! can be called from other (dependent) libraries or applications.
231 //!
232 //! If macro OCCT_STATIC_BUILD is defined, then Standard_EXPORT
233 //! is set to empty. 
234
235 # if defined(_WIN32) && !defined(OCCT_STATIC_BUILD) && !defined(HAVE_NO_DLL)
236
237 //======================================================
238 // Windows-specific definitions
239 //======================================================
240
241 #  ifndef Standard_EXPORT
242 #   define Standard_EXPORT __declspec( dllexport )
243 // For global variables :
244 #   define Standard_EXPORTEXTERN __declspec( dllexport ) extern
245 #   define Standard_EXPORTEXTERNC extern "C" __declspec( dllexport )
246 #  endif  /* Standard_EXPORT */
247
248 #  ifndef Standard_IMPORT
249 #   define Standard_IMPORT __declspec( dllimport ) extern
250 #   define Standard_IMPORTC extern "C" __declspec( dllimport )
251 #  endif  /* Standard_IMPORT */
252
253 # else  /* UNIX */
254
255 //======================================================
256 // UNIX / static library definitions
257 //======================================================
258
259 #  ifndef Standard_EXPORT
260 #   define Standard_EXPORT
261 // For global variables :
262 #   define Standard_EXPORTEXTERN extern
263 #   define Standard_EXPORTEXTERNC extern "C"
264 #  endif  /* Standard_EXPORT */
265
266 #  ifndef Standard_IMPORT
267 #   define Standard_IMPORT extern
268 #   define Standard_IMPORTC extern "C"
269 #  endif  /* Standard_IMPORT */
270
271 // Compatibility with old SUN compilers
272
273 // This preprocessor directive is a kludge to get around
274 // a bug in the Sun Workshop 5.0 compiler, it keeps the
275 // /usr/include/memory.h file from being #included
276 // with an incompatible extern "C" definition of memchr
277 // October 18, 2000  <rboehne@ricardo-us.com>
278 #if __SUNPRO_CC_COMPAT == 5
279 #define _MEMORY_H
280 #endif
281
282 # endif  /* _WIN32 */
283
284 //! @def OCCT_UWP
285 //! This macro is defined on Windows platform in the case if the code
286 //! is being compiled for UWP (Universal Windows Platform).
287 #if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
288  #define OCCT_UWP
289 #else
290  #ifdef OCCT_UWP
291    #undef OCCT_UWP
292  #endif
293 #endif
294
295 //! @def Standard_ATOMIC
296 //! Definition of Standard_ATOMIC for C++11 or visual studio that supports it.
297 //! Before usage there must be "atomic" included in the following way:
298 //! #ifdef Standard_HASATOMIC
299 //!   #include <atomic>
300 //! #endif
301 #if (defined(__cplusplus) && __cplusplus >= 201100L) || (defined(_MSC_VER) && _MSC_VER >= 1800) || \
302     (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))
303   #define Standard_HASATOMIC
304   #define Standard_ATOMIC(theType) std::atomic<theType> 
305 #else
306   #define Standard_ATOMIC(theType) theType
307 #endif
308
309
310 #endif