compiler_setup.hpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
  2. // Copyright 2008-2016 National ICT Australia (NICTA)
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // ------------------------------------------------------------------------
  15. #undef arma_hot
  16. #undef arma_cold
  17. #undef arma_aligned
  18. #undef arma_align_mem
  19. #undef arma_warn_unused
  20. #undef arma_deprecated
  21. #undef arma_malloc
  22. #undef arma_inline
  23. #undef arma_noinline
  24. #undef arma_ignore
  25. #define arma_hot
  26. #define arma_cold
  27. #define arma_aligned
  28. #define arma_align_mem
  29. #define arma_warn_unused
  30. #define arma_deprecated
  31. #define arma_malloc
  32. #define arma_inline inline
  33. #define arma_noinline
  34. #define arma_ignore(variable) ((void)(variable))
  35. #undef arma_fortran_sans_prefix_B
  36. #undef arma_fortran_with_prefix_B
  37. #if defined(ARMA_BLAS_UNDERSCORE)
  38. #define arma_fortran_sans_prefix_B(function) function##_
  39. #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
  40. #define arma_fortran_with_prefix_B(function) wrapper2_##function##_
  41. #else
  42. #define arma_fortran_with_prefix_B(function) wrapper_##function##_
  43. #endif
  44. #else
  45. #define arma_fortran_sans_prefix_B(function) function
  46. #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
  47. #define arma_fortran_with_prefix_B(function) wrapper2_##function
  48. #else
  49. #define arma_fortran_with_prefix_B(function) wrapper_##function
  50. #endif
  51. #endif
  52. #undef arma_fortran
  53. #undef arma_wrapper
  54. #if defined(ARMA_USE_WRAPPER)
  55. #define arma_fortran(function) arma_fortran_with_prefix_B(function)
  56. #define arma_wrapper(function) wrapper_##function
  57. #else
  58. #define arma_fortran(function) arma_fortran_sans_prefix_B(function)
  59. #define arma_wrapper(function) function
  60. #endif
  61. #undef arma_fortran_sans_prefix
  62. #undef arma_fortran_with_prefix
  63. #define arma_fortran_sans_prefix(function) arma_fortran_sans_prefix_B(function)
  64. #define arma_fortran_with_prefix(function) arma_fortran_with_prefix_B(function)
  65. #undef ARMA_INCFILE_WRAP
  66. #define ARMA_INCFILE_WRAP(x) <x>
  67. #if defined(ARMA_USE_CXX11)
  68. #undef ARMA_USE_U64S64
  69. #define ARMA_USE_U64S64
  70. #if !defined(ARMA_32BIT_WORD)
  71. #undef ARMA_64BIT_WORD
  72. #define ARMA_64BIT_WORD
  73. #endif
  74. #if defined(ARMA_64BIT_WORD) && defined(SIZE_MAX)
  75. #if (SIZE_MAX < 0xFFFFFFFFFFFFFFFFull)
  76. // #pragma message ("WARNING: disabled use of 64 bit integers, as std::size_t is smaller than 64 bits")
  77. #undef ARMA_64BIT_WORD
  78. #endif
  79. #endif
  80. #endif
  81. #if defined(ARMA_64BIT_WORD)
  82. #undef ARMA_USE_U64S64
  83. #define ARMA_USE_U64S64
  84. #endif
  85. // most compilers can't vectorise slightly elaborate loops;
  86. // for example clang: http://llvm.org/bugs/show_bug.cgi?id=16358
  87. #undef ARMA_SIMPLE_LOOPS
  88. #define ARMA_SIMPLE_LOOPS
  89. #undef ARMA_GOOD_COMPILER
  90. #undef ARMA_HAVE_TR1
  91. #undef ARMA_HAVE_GETTIMEOFDAY
  92. #undef ARMA_HAVE_SNPRINTF
  93. #undef ARMA_HAVE_ISFINITE
  94. #undef ARMA_HAVE_LOG1P
  95. #undef ARMA_HAVE_ISINF
  96. #undef ARMA_HAVE_ISNAN
  97. #if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
  98. #define ARMA_HAVE_GETTIMEOFDAY
  99. #endif
  100. // posix_memalign() is part of IEEE standard 1003.1
  101. // http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html
  102. // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
  103. // http://sourceforge.net/p/predef/wiki/Standards/
  104. #if ( defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) )
  105. #undef ARMA_HAVE_POSIX_MEMALIGN
  106. #define ARMA_HAVE_POSIX_MEMALIGN
  107. #endif
  108. #if defined(__APPLE__) || defined(__apple_build_version__)
  109. #undef ARMA_BLAS_SDOT_BUG
  110. #define ARMA_BLAS_SDOT_BUG
  111. // #undef ARMA_HAVE_POSIX_MEMALIGN
  112. // NOTE: posix_memalign() is available since macOS 10.6 (late 2009 onwards)
  113. // #undef ARMA_USE_EXTERN_CXX11_RNG
  114. // NOTE: thread_local seems to work in Apple clang since Xcode 8 (mid 2016 onwards)
  115. // NOTE: https://stackoverflow.com/questions/28094794/why-does-apple-clang-disallow-c11-thread-local-when-official-clang-supports
  116. #endif
  117. #if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER)
  118. #undef ARMA_HAVE_POSIX_MEMALIGN
  119. #endif
  120. #undef ARMA_FNSIG
  121. #if defined (__GNUG__)
  122. #define ARMA_FNSIG __PRETTY_FUNCTION__
  123. #elif defined (_MSC_VER)
  124. #define ARMA_FNSIG __FUNCSIG__
  125. #elif defined(__INTEL_COMPILER)
  126. #define ARMA_FNSIG __FUNCTION__
  127. #elif defined(ARMA_USE_CXX11)
  128. #define ARMA_FNSIG __func__
  129. #else
  130. #define ARMA_FNSIG "(unknown)"
  131. #endif
  132. #if !defined(ARMA_ALLOW_FAKE_GCC)
  133. #if (defined(__GNUG__) || defined(__GNUC__)) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
  134. #undef ARMA_DETECTED_FAKE_GCC
  135. #define ARMA_DETECTED_FAKE_GCC
  136. #pragma message ("WARNING: this compiler is pretending to be GCC but it may not be fully compatible;")
  137. #pragma message ("WARNING: to allow this compiler to use GCC features such as data alignment attributes,")
  138. #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_GCC before #include <armadillo>")
  139. #endif
  140. #endif
  141. #if defined(__GNUG__) && (!defined(__clang__) && !defined(ARMA_DETECTED_FAKE_GCC))
  142. // #pragma message ("using GCC extensions")
  143. #undef ARMA_GCC_VERSION
  144. #define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
  145. #if (ARMA_GCC_VERSION < 40800)
  146. #error "*** newer compiler required; need gcc 4.8 or later ***"
  147. #endif
  148. #define ARMA_GOOD_COMPILER
  149. #undef arma_hot
  150. #undef arma_cold
  151. #undef arma_aligned
  152. #undef arma_align_mem
  153. #undef arma_warn_unused
  154. #undef arma_deprecated
  155. #undef arma_malloc
  156. #undef arma_inline
  157. #undef arma_noinline
  158. #define arma_hot __attribute__((__hot__))
  159. #define arma_cold __attribute__((__cold__))
  160. #define arma_aligned __attribute__((__aligned__))
  161. #define arma_align_mem __attribute__((__aligned__(16)))
  162. #define arma_warn_unused __attribute__((__warn_unused_result__))
  163. #define arma_deprecated __attribute__((__deprecated__))
  164. #define arma_malloc __attribute__((__malloc__))
  165. #define arma_inline inline __attribute__((__always_inline__))
  166. #define arma_noinline __attribute__((__noinline__))
  167. #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
  168. #define ARMA_HAVE_ALIGNED_ATTRIBUTE
  169. #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
  170. #define ARMA_HAVE_GCC_ASSUME_ALIGNED
  171. #if !defined(ARMA_USE_CXX11) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && (__cplusplus < 201103L) && !defined(ARMA_DONT_USE_TR1)
  172. #if defined(_GLIBCXX_USE_C99_MATH_TR1) && defined(_GLIBCXX_USE_C99_COMPLEX_TR1)
  173. #define ARMA_HAVE_TR1
  174. #endif
  175. #endif
  176. // gcc's vectoriser can handle elaborate loops
  177. #undef ARMA_SIMPLE_LOOPS
  178. #if defined(__OPTIMIZE_SIZE__)
  179. #define ARMA_SIMPLE_LOOPS
  180. #endif
  181. #if !defined(ARMA_USE_CXX11) && (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
  182. #define ARMA_HAVE_SNPRINTF
  183. #define ARMA_HAVE_ISFINITE
  184. #define ARMA_HAVE_LOG1P
  185. #define ARMA_HAVE_ISINF
  186. #define ARMA_HAVE_ISNAN
  187. #endif
  188. #endif
  189. #if !defined(ARMA_ALLOW_FAKE_CLANG)
  190. #if defined(__clang__) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
  191. #undef ARMA_DETECTED_FAKE_CLANG
  192. #define ARMA_DETECTED_FAKE_CLANG
  193. #pragma message ("WARNING: this compiler is pretending to be Clang but it may not be fully compatible;")
  194. #pragma message ("WARNING: to allow this compiler to use Clang features such as data alignment attributes,")
  195. #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_CLANG before #include <armadillo>")
  196. #endif
  197. #endif
  198. #if defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG)
  199. // #pragma message ("using Clang extensions")
  200. #define ARMA_GOOD_COMPILER
  201. #if !defined(__has_attribute)
  202. #define __has_attribute(x) 0
  203. #endif
  204. #if __has_attribute(__aligned__)
  205. #undef arma_aligned
  206. #undef arma_align_mem
  207. #define arma_aligned __attribute__((__aligned__))
  208. #define arma_align_mem __attribute__((__aligned__(16)))
  209. #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
  210. #define ARMA_HAVE_ALIGNED_ATTRIBUTE
  211. #endif
  212. #if __has_attribute(__warn_unused_result__)
  213. #undef arma_warn_unused
  214. #define arma_warn_unused __attribute__((__warn_unused_result__))
  215. #endif
  216. #if __has_attribute(__deprecated__)
  217. #undef arma_deprecated
  218. #define arma_deprecated __attribute__((__deprecated__))
  219. #endif
  220. #if __has_attribute(__malloc__)
  221. #undef arma_malloc
  222. #define arma_malloc __attribute__((__malloc__))
  223. #endif
  224. #if __has_attribute(__always_inline__)
  225. #undef arma_inline
  226. #define arma_inline inline __attribute__((__always_inline__))
  227. #endif
  228. #if __has_attribute(__noinline__)
  229. #undef arma_noinline
  230. #define arma_noinline __attribute__((__noinline__))
  231. #endif
  232. #if __has_attribute(__hot__)
  233. #undef arma_hot
  234. #define arma_hot __attribute__((__hot__))
  235. #endif
  236. #if __has_attribute(__minsize__)
  237. #undef arma_cold
  238. #define arma_cold __attribute__((__minsize__))
  239. #elif __has_attribute(__cold__)
  240. #undef arma_cold
  241. #define arma_cold __attribute__((__cold__))
  242. #endif
  243. #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned)
  244. #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
  245. #define ARMA_HAVE_GCC_ASSUME_ALIGNED
  246. #endif
  247. #if !defined(ARMA_USE_CXX11) && (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
  248. #define ARMA_HAVE_SNPRINTF
  249. #define ARMA_HAVE_ISFINITE
  250. #define ARMA_HAVE_LOG1P
  251. #define ARMA_HAVE_ISINF
  252. #define ARMA_HAVE_ISNAN
  253. #endif
  254. #endif
  255. #if defined(__INTEL_COMPILER)
  256. #if (__INTEL_COMPILER == 9999)
  257. #error "*** newer compiler required ***"
  258. #endif
  259. #if (__INTEL_COMPILER < 1400)
  260. #error "*** newer compiler required ***"
  261. #endif
  262. #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
  263. #undef ARMA_HAVE_ICC_ASSUME_ALIGNED
  264. #define ARMA_HAVE_ICC_ASSUME_ALIGNED
  265. #if defined(ARMA_USE_CXX11)
  266. #if (__INTEL_COMPILER < 1500)
  267. #undef ARMA_PRINT_CXX11_WARNING
  268. #define ARMA_PRINT_CXX11_WARNING
  269. #endif
  270. #endif
  271. #endif
  272. #if defined(_MSC_VER)
  273. #if (_MSC_VER < 1700)
  274. #error "*** newer compiler required ***"
  275. #endif
  276. #if (_MSC_VER < 1800)
  277. #undef ARMA_PRINT_CXX98_WARNING
  278. #define ARMA_PRINT_CXX98_WARNING
  279. #endif
  280. #if defined(ARMA_USE_CXX11)
  281. #if (_MSC_VER < 1900)
  282. #undef ARMA_PRINT_CXX11_WARNING
  283. #define ARMA_PRINT_CXX11_WARNING
  284. #endif
  285. #endif
  286. #undef arma_deprecated
  287. #define arma_deprecated __declspec(deprecated)
  288. // #undef arma_inline
  289. // #define arma_inline inline __forceinline
  290. #pragma warning(push)
  291. #pragma warning(disable: 4127) // conditional expression is constant
  292. #pragma warning(disable: 4180) // qualifier has no meaning
  293. #pragma warning(disable: 4244) // possible loss of data when converting types (see also 4305)
  294. #pragma warning(disable: 4510) // default constructor could not be generated
  295. #pragma warning(disable: 4511) // copy constructor can't be generated
  296. #pragma warning(disable: 4512) // assignment operator can't be generated
  297. #pragma warning(disable: 4513) // destructor can't be generated
  298. #pragma warning(disable: 4514) // unreferenced inline function has been removed
  299. #pragma warning(disable: 4522) // multiple assignment operators specified
  300. #pragma warning(disable: 4623) // default constructor can't be generated
  301. #pragma warning(disable: 4624) // destructor can't be generated
  302. #pragma warning(disable: 4625) // copy constructor can't be generated
  303. #pragma warning(disable: 4626) // assignment operator can't be generated
  304. #pragma warning(disable: 4702) // unreachable code
  305. #pragma warning(disable: 4710) // function not inlined
  306. #pragma warning(disable: 4711) // call was inlined
  307. #pragma warning(disable: 4714) // __forceinline can't be inlined
  308. #pragma warning(disable: 4800) // value forced to bool
  309. #if defined(ARMA_USE_CXX11)
  310. #pragma warning(disable: 4519) // default template args are only allowed on a class template
  311. #endif
  312. // #if (_MANAGED == 1) || (_M_CEE == 1)
  313. //
  314. // // don't do any alignment when compiling in "managed code" mode
  315. //
  316. // #undef arma_aligned
  317. // #define arma_aligned
  318. //
  319. // #undef arma_align_mem
  320. // #define arma_align_mem
  321. //
  322. // #elif (_MSC_VER >= 1700)
  323. //
  324. // #undef arma_align_mem
  325. // #define arma_align_mem __declspec(align(16))
  326. //
  327. // #define ARMA_HAVE_ALIGNED_ATTRIBUTE
  328. //
  329. // // disable warnings: "structure was padded due to __declspec(align(16))"
  330. // #pragma warning(disable: 4324)
  331. //
  332. // #endif
  333. #endif
  334. #if defined(__SUNPRO_CC)
  335. // http://www.oracle.com/technetwork/server-storage/solarisstudio/training/index-jsp-141991.html
  336. // http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/cplusplus-faq-355066.html
  337. #if (__SUNPRO_CC < 0x5130)
  338. #error "*** newer compiler required ***"
  339. #endif
  340. #if defined(ARMA_USE_CXX11)
  341. #if (__SUNPRO_CC < 0x5140)
  342. #undef ARMA_PRINT_CXX11_WARNING
  343. #define ARMA_PRINT_CXX11_WARNING
  344. #endif
  345. #endif
  346. #endif
  347. #if defined(ARMA_USE_CXX11) && defined(__CYGWIN__) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
  348. #pragma message ("WARNING: Cygwin may have incomplete support for C++11 features.")
  349. #endif
  350. #if defined(ARMA_USE_CXX11) && (__cplusplus < 201103L)
  351. #undef ARMA_PRINT_CXX11_WARNING
  352. #define ARMA_PRINT_CXX11_WARNING
  353. #endif
  354. #if defined(ARMA_PRINT_CXX98_WARNING) && !defined(ARMA_DONT_PRINT_CXX98_WARNING)
  355. #pragma message ("WARNING: this compiler is OUTDATED and has INCOMPLETE support for the C++ standard;")
  356. #pragma message ("WARNING: if something breaks, you get to keep all the pieces.")
  357. #endif
  358. #if defined(ARMA_PRINT_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
  359. #pragma message ("WARNING: use of C++11 features has been enabled,")
  360. #pragma message ("WARNING: but this compiler has INCOMPLETE support for C++11;")
  361. #pragma message ("WARNING: if something breaks, you get to keep all the pieces.")
  362. #pragma message ("WARNING: to forcefully prevent Armadillo from using C++11 features,")
  363. #pragma message ("WARNING: #define ARMA_DONT_USE_CXX11 before #include <armadillo>")
  364. #endif
  365. #if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201107))) )
  366. // OpenMP 3.1 required for atomic read and atomic write
  367. // OpenMP 3.0 required for parallelisation of loops with unsigned integers
  368. #undef ARMA_USE_OPENMP
  369. #undef ARMA_PRINT_OPENMP_WARNING
  370. #define ARMA_PRINT_OPENMP_WARNING
  371. #endif
  372. #if defined(ARMA_PRINT_OPENMP_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
  373. #pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 3.1+ not detected")
  374. #if (defined(_OPENMP) && (_OPENMP < 201107))
  375. #pragma message ("NOTE: your compiler appears to have an ancient version of OpenMP")
  376. #pragma message ("NOTE: consider upgrading to a better compiler")
  377. #endif
  378. #endif
  379. #if defined(ARMA_USE_OPENMP) && !defined(ARMA_USE_CXX11)
  380. #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION >= 50400)) || (defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG))
  381. #undef ARMA_PRINT_OPENMP_CXX11_WARNING
  382. #define ARMA_PRINT_OPENMP_CXX11_WARNING
  383. #endif
  384. #endif
  385. #if defined(ARMA_PRINT_OPENMP_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
  386. #pragma message ("WARNING: support for OpenMP requires C++11/C++14; add -std=c++11 or -std=c++14 to compiler flags")
  387. #endif
  388. #if defined(ARMA_USE_OPENMP) && defined(ARMA_USE_CXX11)
  389. #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION < 50400))
  390. // due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57580
  391. // TODO: gcc 4.9.4 is also fixed, so use a more fine-grained gcc version check?
  392. #undef ARMA_USE_OPENMP
  393. #if !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
  394. #pragma message ("WARNING: use of OpenMP disabled due to compiler bug in gcc <= 5.3")
  395. #endif
  396. #endif
  397. #endif
  398. #if defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION >= 50400) && !defined(ARMA_USE_CXX11)
  399. #if !defined(ARMA_PRINT_CXX11_WARNING) && !defined(ARMA_PRINT_OPENMP_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
  400. #pragma message ("NOTE: suggest to enable C++14 mode for faster code; add -std=c++14 to compiler flags")
  401. #endif
  402. #endif
  403. // cleanup
  404. #undef ARMA_DETECTED_FAKE_GCC
  405. #undef ARMA_DETECTED_FAKE_CLANG
  406. #undef ARMA_GCC_VERSION
  407. #undef ARMA_PRINT_CXX98_WARNING
  408. #undef ARMA_PRINT_CXX11_WARNING
  409. #undef ARMA_PRINT_OPENMP_WARNING
  410. #undef ARMA_PRINT_OPENMP_CXX11_WARNING
  411. #if defined(log2)
  412. #undef log2
  413. #pragma message ("WARNING: detected 'log2' macro and undefined it")
  414. #endif
  415. //
  416. // whoever defined macros with the names "min" and "max" should be permanently removed from the gene pool
  417. #if defined(min) || defined(max)
  418. #undef min
  419. #undef max
  420. #pragma message ("WARNING: detected 'min' and/or 'max' macros and undefined them;")
  421. #pragma message ("WARNING: you may wish to define NOMINMAX before including any windows header")
  422. #endif
  423. //
  424. // handle more stupid macros
  425. // https://sourceware.org/bugzilla/show_bug.cgi?id=19239
  426. #undef minor
  427. #undef major