e2b6680be35c7b8d5e32ac2629d2376e28efb256
[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 overriden 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_UNUSED
61 //! Macro for marking variables / functions as possibly unused
62 //! so that compiler will not emit redundant "unused" warnings.
63 //!
64 //! Expands to "__attribute__((unused))" on GCC and CLang.
65 #if defined(__GNUC__) || defined(__clang__)
66   #define Standard_UNUSED __attribute__((unused))
67 #else
68   #define Standard_UNUSED
69 #endif
70
71 //! @def Standard_DEPRECATED("message")
72 //! Can be used in declaration of a method or a class to mark it as deprecated.
73 //! Use of such method or class will cause compiler warning (if supported by 
74 //! compiler and unless disabled).
75 //! If macro OCCT_NO_DEPRECATED is defined, Standard_DEPRECATED is defined empty.
76 #ifdef OCCT_NO_DEPRECATED
77   #define Standard_DEPRECATED(theMsg)
78 #else
79 #if defined(_MSC_VER)
80   #define Standard_DEPRECATED(theMsg) __declspec(deprecated(theMsg))
81 #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || defined(__clang__))
82   #define Standard_DEPRECATED(theMsg) __attribute__((deprecated(theMsg)))
83 #elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
84   #define Standard_DEPRECATED(theMsg) __attribute__((deprecated))
85 #else
86   #define Standard_DEPRECATED(theMsg)
87 #endif
88 #endif
89
90 //! @def Standard_DISABLE_DEPRECATION_WARNINGS
91 //! Disables warnings on use of deprecated features (see Standard_DEPRECATED),
92 //! from the current point till appearance of Standard_ENABLE_DEPRECATION_WARNINGS macro.
93 //! This is useful for sections of code kept for backward compatibility and scheduled for removal.
94 //!
95 //! @def Standard_ENABLE_DEPRECATION_WARNINGS
96 //! Enables warnings on use of deprecated features previously disabled by
97 //! Standard_DISABLE_DEPRECATION_WARNINGS.
98 #if defined(__ICL) || defined (__INTEL_COMPILER)
99   #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478))
100   #define Standard_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
101 #elif defined(_MSC_VER)
102   #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996))
103   #define Standard_ENABLE_DEPRECATION_WARNINGS  __pragma(warning(pop))
104 #elif (defined(__GNUC__) && __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__)
105   // available since at least gcc 4.2 (maybe earlier), however only gcc 4.6+ supports this pragma inside the function body
106   // CLang also supports this gcc syntax (in addition to "clang diagnostic ignored")
107   #define Standard_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
108   #define Standard_ENABLE_DEPRECATION_WARNINGS  _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"")
109 #else
110   #define Standard_DISABLE_DEPRECATION_WARNINGS
111   #define Standard_ENABLE_DEPRECATION_WARNINGS
112 #endif
113
114 //! @def OCCT_NO_RVALUE_REFERENCE
115 //! Disables methods and constructors that use rvalue references
116 //! (C++11 move semantics) not supported by obsolete compilers.
117 #if (defined(_MSC_VER) && (_MSC_VER < 1600))
118   #define OCCT_NO_RVALUE_REFERENCE
119 #endif
120
121 # ifdef _WIN32
122
123 // We must be careful including windows.h: it is really poisonous stuff!
124 // The most annoying are #defines of many identifiers that you could use in 
125 // normal code without knowing that Windows has its own knowledge of them...
126 // So lets protect ourselves by switching OFF as much as possible of this in advance.
127 // If someone needs more from windows.h, he is encouraged to #undef these symbols
128 // or include windows.h prior to any OCCT stuff.
129 // Note that we define each symbol to itself, so that it still can be used
130 // e.g. as name of variable, method etc.
131 #ifndef WIN32_LEAN_AND_MEAN
132 #define WIN32_LEAN_AND_MEAN   /* exclude extra Windows stuff */
133 #endif
134 #ifndef NOMINMAX
135 #define NOMINMAX NOMINMAX     /* avoid #define min() and max() */
136 #endif
137 #ifndef NOMSG
138 #define NOMSG NOMSG           /* avoid #define SendMessage etc. */
139 #endif
140 #ifndef NODRAWTEXT
141 #define NODRAWTEXT NODRAWTEXT /* avoid #define DrawText etc. */
142 #endif
143 #ifndef NONLS
144 #define NONLS NONLS           /* avoid #define CompareString etc. */
145 #endif
146 #ifndef NOGDI
147 #define NOGDI NOGDI           /* avoid #define SetPrinter (winspool.h) etc. */
148 #endif
149 #ifndef NOSERVICE
150 #define NOSERVICE NOSERVICE   
151 #endif
152 #ifndef NOKERNEL
153 #define NOKERNEL NOKERNEL
154 #endif
155 #ifndef NOUSER
156 #define NOUSER NOUSER
157 #endif
158 #ifndef NOMCX
159 #define NOMCX NOMCX
160 #endif
161 #ifndef NOIME
162 #define NOIME NOIME
163 #endif
164
165 #endif
166
167 //! @def Standard_EXPORT
168 //! This macro should be used in declarations of public methods 
169 //! to ensure that they are exported from DLL on Windows and thus
170 //! can be called from other (dependent) libraries or applications.
171
172 # if defined(_WIN32) && !defined(HAVE_NO_DLL)
173
174 //======================================================
175 // Windows-specific definitions
176 //======================================================
177
178 #  ifndef Standard_EXPORT
179 #   define Standard_EXPORT __declspec( dllexport )
180 // For global variables :
181 #   define Standard_EXPORTEXTERN __declspec( dllexport ) extern
182 #   define Standard_EXPORTEXTERNC extern "C" __declspec( dllexport )
183 #  endif  /* Standard_EXPORT */
184
185 #  ifndef Standard_IMPORT
186 #   define Standard_IMPORT __declspec( dllimport ) extern
187 #   define Standard_IMPORTC extern "C" __declspec( dllimport )
188 #  endif  /* Standard_IMPORT */
189
190 # else  /* UNIX */
191
192 //======================================================
193 // UNIX / static library definitions
194 //======================================================
195
196 #  ifndef Standard_EXPORT
197 #   define Standard_EXPORT
198 // For global variables :
199 #   define Standard_EXPORTEXTERN extern
200 #   define Standard_EXPORTEXTERNC extern "C"
201 #  endif  /* Standard_EXPORT */
202
203 #  ifndef Standard_IMPORT
204 #   define Standard_IMPORT extern
205 #   define Standard_IMPORTC extern "C"
206 #  endif  /* Standard_IMPORT */
207
208 // Compatibility with old SUN compilers
209
210 // This preprocessor directive is a kludge to get around
211 // a bug in the Sun Workshop 5.0 compiler, it keeps the
212 // /usr/include/memory.h file from being #included
213 // with an incompatible extern "C" definition of memchr
214 // October 18, 2000  <rboehne@ricardo-us.com>
215 #if __SUNPRO_CC_COMPAT == 5
216 #define _MEMORY_H
217 #endif
218
219 # endif  /* _WIN32 */
220
221 //======================================================
222 // Other
223 //======================================================
224
225 # ifndef __Standard_API
226 #   if !defined(_WIN32) || defined(__Standard_DLL) || defined(__FSD_DLL) || defined(__MMgt_DLL) || defined(__OSD_DLL) || defined(__Plugin_DLL) || defined(__Quantity_DLL) || defined(__Resource_DLL) || defined(__SortTools_DLL) || defined(__StdFail_DLL) || defined(__Storage_DLL) || defined(__TColStd_DLL) || defined(__TCollection_DLL) || defined(__TShort_DLL) || defined(__Units_DLL) || defined(__UnitsAPI_DLL) || defined(__Dico_DLL)
227 #    define __Standard_API Standard_EXPORT
228 #    define __Standard_APIEXTERN Standard_EXPORTEXTERN
229 #   else
230 #    define __Standard_API Standard_IMPORT
231 #    define __Standard_APIEXTERN Standard_IMPORT
232 #   endif  // __Standard_DLL
233 # endif  // __Standard_API
234
235 //! @def OCCT_UWP
236 //! This macro is defined on Windows platform in the case if the code
237 //! is being compiled for UWP (Universal Windows Platform).
238 #if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
239  #define OCCT_UWP
240 #else
241  #ifdef OCCT_UWP
242    #undef OCCT_UWP
243  #endif
244 #endif
245
246 #endif