• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Common.h
2 
3 #if defined(_MSC_VER) && _MSC_VER >= 1800
4 #pragma warning(disable : 4464) // relative include path contains '..'
5 #endif
6 
7 #ifndef ZIP7_INC_COMMON_H
8 #define ZIP7_INC_COMMON_H
9 
10 #include "../../C/Compiler.h"
11 
12 /*
13 This file is included to all cpp files in 7-Zip.
14 Each folder contains StdAfx.h file that includes "Common.h".
15 So 7-Zip includes "Common.h" in both modes:
16   with precompiled StdAfx.h
17 and
18   without precompiled StdAfx.h
19 
20 If you use 7-Zip code, you must include "Common.h" before other h files of 7-zip.
21 If you don't need some things that are used in 7-Zip,
22 you can change this h file or h files included in this file.
23 */
24 
25 #ifdef _MSC_VER
26   #pragma warning(disable : 4710) // function not inlined
27   // 'CUncopyable::CUncopyable':
28   #pragma warning(disable : 4514) // unreferenced inline function has been removed
29   #if _MSC_VER < 1300
30     #pragma warning(disable : 4702) // unreachable code
31     #pragma warning(disable : 4714) // function marked as __forceinline not inlined
32     #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
33   #endif
34   #if _MSC_VER < 1400
35     #pragma warning(disable : 4511) // copy constructor could not be generated    // #pragma warning(disable : 4512) // assignment operator could not be generated
36     #pragma warning(disable : 4512) // assignment operator could not be generated
37   #endif
38   #if _MSC_VER > 1400 && _MSC_VER <= 1900
39     // #pragma warning(disable : 4996)
40        // strcat: This function or variable may be unsafe
41        // GetVersion was declared deprecated
42   #endif
43 
44 #if _MSC_VER > 1200
45 // -Wall warnings
46 
47 #if _MSC_VER <= 1600
48 #pragma warning(disable : 4917) // 'OLE_HANDLE' : a GUID can only be associated with a class, interface or namespace
49 #endif
50 
51 // #pragma warning(disable : 4061) // enumerator '' in switch of enum '' is not explicitly handled by a case label
52 // #pragma warning(disable : 4266) // no override available for virtual member function from base ''; function is hidden
53 #pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted
54 #pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted
55 #if _MSC_VER >= 1600 && _MSC_VER < 1920
56 #pragma warning(disable : 4571) // Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
57 #endif
58 #if _MSC_VER >= 1600
59 #pragma warning(disable : 4365) // 'initializing' : conversion from 'int' to 'unsigned int', signed / unsigned mismatch
60 #endif
61 #if _MSC_VER < 1800
62 // we disable the warning, if we don't use 'final' in class
63 #pragma warning(disable : 4265) // class has virtual functions, but destructor is not virtual
64 #endif
65 
66 #if _MSC_VER >= 1900
67 #pragma warning(disable : 5026) // move constructor was implicitly defined as deleted
68 #pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted
69 #endif
70 #if _MSC_VER >= 1912
71 #pragma warning(disable : 5039) // pointer or reference to potentially throwing function passed to 'extern "C"' function under - EHc.Undefined behavior may occur if this function throws an exception.
72 #endif
73 #if _MSC_VER >= 1925
74 // #pragma warning(disable : 5204) // 'ISequentialInStream' : class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly
75 #endif
76 #if _MSC_VER >= 1934
77 // #pragma warning(disable : 5264) // const variable is not used
78 #endif
79 
80 #endif // _MSC_VER > 1200
81 #endif // _MSC_VER
82 
83 
84 #if defined(_MSC_VER) // && !defined(__clang__)
85 #define Z7_DECLSPEC_NOTHROW   __declspec(nothrow)
86 #elif defined(__clang__) || defined(__GNUC__)
87 #define Z7_DECLSPEC_NOTHROW   __attribute__((nothrow))
88 #else
89 #define Z7_DECLSPEC_NOTHROW
90 #endif
91 
92 /*
93 #if defined (_MSC_VER) && _MSC_VER >= 1900 \
94     || defined(__clang__) && __clang_major__ >= 6 \
95     || defined(__GNUC__) && __GNUC__ >= 6
96   #define Z7_noexcept noexcept
97 #else
98   #define Z7_noexcept throw()
99 #endif
100 */
101 
102 
103 #if defined(__clang__)
104 
105 // noexcept, final, = delete
106 #pragma GCC diagnostic ignored "-Wc++98-compat"
107 #if __clang_major__ >= 4
108 // throw() dynamic exception specifications are deprecated
109 #pragma GCC diagnostic ignored "-Wdeprecated-dynamic-exception-spec"
110 #endif
111 #pragma GCC diagnostic ignored "-Wold-style-cast"
112 #pragma GCC diagnostic ignored "-Wglobal-constructors"
113 #pragma GCC diagnostic ignored "-Wexit-time-destructors"
114 
115 // #pragma GCC diagnostic ignored "-Wunused-private-field"
116 // #pragma GCC diagnostic ignored "-Wnonportable-system-include-path"
117 // #pragma GCC diagnostic ignored "-Wsuggest-override"
118 // #pragma GCC diagnostic ignored "-Wsign-conversion"
119 // #pragma GCC diagnostic ignored "-Winconsistent-missing-override"
120 // #pragma GCC diagnostic ignored "-Wsuggest-destructor-override"
121 // #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
122 // #pragma GCC diagnostic ignored "-Wdeprecated-copy-with-user-provided-dtor"
123 // #pragma GCC diagnostic ignored "-Wdeprecated-copy-dtor"
124 // #ifndef _WIN32
125 // #pragma GCC diagnostic ignored "-Wweak-vtables"
126 // #endif
127 /*
128 #if   defined(Z7_GCC_VERSION)   && (Z7_GCC_VERSION   >= 40400) \
129    || defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30000)
130 // enumeration values not explicitly handled in switch
131 #pragma GCC diagnostic ignored "-Wswitch-enum"
132 #endif
133 */
134 #endif // __clang__
135 
136 
137 #ifdef __GNUC__
138 // #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
139 #endif
140 
141 
142 /* There is BUG in MSVC 6.0 compiler for operator new[]:
143    It doesn't check overflow, when it calculates size in bytes for allocated array.
144    So we can use Z7_ARRAY_NEW macro instead of new[] operator. */
145 
146 #if defined(_MSC_VER) && (_MSC_VER == 1200) && !defined(_WIN64)
147   #define Z7_ARRAY_NEW(p, T, size)  p = new T[((size) > (unsigned)0xFFFFFFFF / sizeof(T)) ? (unsigned)0xFFFFFFFF / sizeof(T) : (size)];
148 #else
149   #define Z7_ARRAY_NEW(p, T, size)  p = new T[size];
150 #endif
151 
152 #if (defined(__GNUC__) && (__GNUC__ >= 8))
153   #define Z7_ATTR_NORETURN  __attribute__((noreturn))
154 #elif (defined(__clang__) && (__clang_major__ >= 3))
155   #if __has_feature(cxx_attributes)
156     #define Z7_ATTR_NORETURN  [[noreturn]]
157   #else
158     #define Z7_ATTR_NORETURN  __attribute__((noreturn))
159   #endif
160 #elif (defined(_MSC_VER) && (_MSC_VER >= 1900))
161   #define Z7_ATTR_NORETURN  [[noreturn]]
162 #else
163   #define Z7_ATTR_NORETURN
164 #endif
165 
166 
167 // final in "GCC 4.7.0"
168 // In C++98 and C++03 code the alternative spelling __final can be used instead (this is a GCC extension.)
169 
170 #if defined (__cplusplus) && __cplusplus >= 201103L \
171     || defined(_MSC_VER) && _MSC_VER >= 1800 \
172     || defined(__clang__) && __clang_major__ >= 4 \
173     /* || defined(__GNUC__) && __GNUC__ >= 9 */
174   #define Z7_final  final
175   #if defined(__clang__) && __cplusplus < 201103L
176     #pragma GCC diagnostic ignored "-Wc++11-extensions"
177   #endif
178 #elif defined (__cplusplus) && __cplusplus >= 199711L \
179     && defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
180   #define Z7_final __final
181 #else
182   #define Z7_final
183   #if defined(__clang__) && __clang_major__ >= 4 \
184      || defined(__GNUC__) && __GNUC__ >= 4
185     #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
186     #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
187   #endif
188 #endif
189 
190 #define Z7_class_final(c)  class c Z7_final
191 
192 
193 #if defined (__cplusplus) && __cplusplus >= 201103L \
194     || (defined(_MSC_VER) && _MSC_VER >= 1800)
195   #define Z7_CPP_IS_SUPPORTED_default
196   #define Z7_eq_delete  = delete
197   // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c) c(const c& k) = default;
198 #else
199   #define Z7_eq_delete
200   // #define Z7_DECL_DEFAULT_COPY_CONSTRUCTOR_IF_SUPPORTED(c)
201 #endif
202 
203 
204 #if defined(__cplusplus) && (__cplusplus >= 201103L) \
205     || defined(_MSC_VER) && (_MSC_VER >= 1400) /* && (_MSC_VER != 1600) */ \
206     || defined(__clang__) && __clang_major__ >= 4
207   #if defined(_MSC_VER) && (_MSC_VER == 1600) /* && (_MSC_VER != 1600) */
208     #pragma warning(disable : 4481) // nonstandard extension used: override specifier 'override'
209     #define Z7_DESTRUCTOR_override
210   #else
211     #define Z7_DESTRUCTOR_override  override
212   #endif
213   #define Z7_override  override
214 #else
215   #define Z7_override
216   #define Z7_DESTRUCTOR_override
217 #endif
218 
219 
220 
221 #define Z7_CLASS_NO_COPY(cls) \
222   private: \
223   cls(const cls &) Z7_eq_delete; \
224   cls &operator=(const cls &) Z7_eq_delete;
225 
226 class CUncopyable
227 {
228 protected:
CUncopyable()229   CUncopyable() {} // allow constructor
230   // ~CUncopyable() {}
231   Z7_CLASS_NO_COPY(CUncopyable)
232 };
233 
234 #define MY_UNCOPYABLE  :private CUncopyable
235 // #define MY_UNCOPYABLE
236 
237 
238 typedef void (*Z7_void_Function)(void);
239 
240 #if defined(__clang__) || defined(__GNUC__)
241 #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<Z7_void_Function>(e))
242 #else
243 #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(reinterpret_cast<void*>(e))
244 // #define Z7_CAST_FUNC(t, e) reinterpret_cast<t>(e)
245 #endif
246 
247 #define Z7_GET_PROC_ADDRESS(func_type, hmodule, func_name)  \
248     Z7_CAST_FUNC(func_type, GetProcAddress(hmodule, func_name))
249 
250 // || defined(__clang__)
251 // || defined(__GNUC__)
252 
253 #if defined(_MSC_VER) && (_MSC_VER >= 1400)
254 #define Z7_DECLSPEC_NOVTABLE __declspec(novtable)
255 #else
256 #define Z7_DECLSPEC_NOVTABLE
257 #endif
258 
259 #ifdef __clang__
260 #define Z7_PURE_INTERFACES_BEGIN \
261 _Pragma("GCC diagnostic push") \
262 _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
263 _Pragma("GCC diagnostic ignored \"-Wweak-vtables\"")
264 #define Z7_PURE_INTERFACES_END \
265 _Pragma("GCC diagnostic pop")
266 #else
267 #define Z7_PURE_INTERFACES_BEGIN
268 #define Z7_PURE_INTERFACES_END
269 #endif
270 
271 // NewHandler.h and NewHandler.cpp redefine operator new() to throw exceptions, if compiled with old MSVC compilers
272 #include "NewHandler.h"
273 
274 /*
275 // #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
276 #ifndef ARRAY_SIZE
277 #define ARRAY_SIZE(a)  Z7_ARRAY_SIZE(a)
278 #endif
279 */
280 
281 #endif // ZIP7_INC_COMMON_H
282 
283 
284 
285 // #define Z7_REDEFINE_NULL
286 
287 #if defined(Z7_REDEFINE_NULL) /* && (!defined(__clang__) || defined(_MSC_VER)) */
288 
289 // NULL is defined in <stddef.h>
290 #include <stddef.h>
291 #undef NULL
292 
293 #ifdef __cplusplus
294   #if defined (__cplusplus) && __cplusplus >= 201103L \
295     || (defined(_MSC_VER) && _MSC_VER >= 1800)
296     #define NULL  nullptr
297   #else
298     #define NULL  0
299   #endif
300 #else
301   #define NULL  ((void *)0)
302 #endif
303 
304 #else // Z7_REDEFINE_NULL
305 
306 #if defined(__clang__) && __clang_major__ >= 5
307 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
308 #endif
309 
310 #endif // Z7_REDEFINE_NULL
311 
312 // for precompiler:
313 #include "MyWindows.h"
314