cpp.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * Name: wx/cpp.h
  3. * Purpose: Various preprocessor helpers
  4. * Author: Vadim Zeitlin
  5. * Created: 2006-09-30
  6. * Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
  7. * Licence: wxWindows licence
  8. */
  9. /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
  10. #ifndef _WX_CPP_H_
  11. #define _WX_CPP_H_
  12. #include "wx/compiler.h" /* wxCHECK_XXX_VERSION() macros */
  13. /* wxCONCAT works like preprocessor ## operator but also works with macros */
  14. #define wxCONCAT_HELPER(text, line) text ## line
  15. #define wxCONCAT(x1, x2) \
  16. wxCONCAT_HELPER(x1, x2)
  17. #define wxCONCAT3(x1, x2, x3) \
  18. wxCONCAT(wxCONCAT(x1, x2), x3)
  19. #define wxCONCAT4(x1, x2, x3, x4) \
  20. wxCONCAT(wxCONCAT3(x1, x2, x3), x4)
  21. #define wxCONCAT5(x1, x2, x3, x4, x5) \
  22. wxCONCAT(wxCONCAT4(x1, x2, x3, x4), x5)
  23. #define wxCONCAT6(x1, x2, x3, x4, x5, x6) \
  24. wxCONCAT(wxCONCAT5(x1, x2, x3, x4, x5), x6)
  25. #define wxCONCAT7(x1, x2, x3, x4, x5, x6, x7) \
  26. wxCONCAT(wxCONCAT6(x1, x2, x3, x4, x5, x6), x7)
  27. #define wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8) \
  28. wxCONCAT(wxCONCAT7(x1, x2, x3, x4, x5, x6, x7), x8)
  29. #define wxCONCAT9(x1, x2, x3, x4, x5, x6, x7, x8, x9) \
  30. wxCONCAT(wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8), x9)
  31. /* wxSTRINGIZE works as the preprocessor # operator but also works with macros */
  32. #define wxSTRINGIZE_HELPER(x) #x
  33. #define wxSTRINGIZE(x) wxSTRINGIZE_HELPER(x)
  34. /* a Unicode-friendly version of wxSTRINGIZE_T */
  35. #define wxSTRINGIZE_T(x) wxAPPLY_T(wxSTRINGIZE(x))
  36. /*
  37. Special workarounds for compilers with broken "##" operator. For all the
  38. other ones we can just use it directly.
  39. */
  40. #ifdef wxCOMPILER_BROKEN_CONCAT_OPER
  41. #define wxPREPEND_L(x) L ## x
  42. #define wxAPPEND_i64(x) x ## i64
  43. #define wxAPPEND_ui64(x) x ## ui64
  44. #endif /* wxCOMPILER_BROKEN_CONCAT_OPER */
  45. /*
  46. Helper macros for wxMAKE_UNIQUE_NAME: normally this works by appending the
  47. current line number to the given identifier to reduce the probability of the
  48. conflict (it may still happen if this is used in the headers, hence you
  49. should avoid doing it or provide unique prefixes then) but we have to do it
  50. differently for VC++
  51. */
  52. #if defined(__VISUALC__) && (__VISUALC__ >= 1300)
  53. /*
  54. __LINE__ handling is completely broken in VC++ when using "Edit and
  55. Continue" (/ZI option) and results in preprocessor errors if we use it
  56. inside the macros. Luckily VC7 has another standard macro which can be
  57. used like this and is even better than __LINE__ because it is globally
  58. unique.
  59. */
  60. # define wxCONCAT_LINE(text) wxCONCAT(text, __COUNTER__)
  61. #else /* normal compilers */
  62. # define wxCONCAT_LINE(text) wxCONCAT(text, __LINE__)
  63. #endif
  64. /* Create a "unique" name with the given prefix */
  65. #define wxMAKE_UNIQUE_NAME(text) wxCONCAT_LINE(text)
  66. /*
  67. This macro can be passed as argument to another macro when you don't have
  68. anything to pass in fact.
  69. */
  70. #define wxEMPTY_PARAMETER_VALUE /* Fake macro parameter value */
  71. /*
  72. Helpers for defining macros that expand into a single statement.
  73. The standatd solution is to use "do { ... } while (0)" statement but MSVC
  74. generates a C4127 "condition expression is constant" warning for it so we
  75. use something which is just complicated enough to not be recognized as a
  76. constant but still simple enough to be optimized away.
  77. Another solution would be to use __pragma() to temporarily disable C4127.
  78. Notice that wxASSERT_ARG_TYPE in wx/strvargarg.h relies on these macros
  79. creating some kind of a loop because it uses "break".
  80. */
  81. #ifdef __WATCOMC__
  82. #define wxFOR_ONCE(name) for(int name=0; name<1; name++)
  83. #define wxSTATEMENT_MACRO_BEGIN wxFOR_ONCE(wxMAKE_UNIQUE_NAME(wxmacro)) {
  84. #define wxSTATEMENT_MACRO_END }
  85. #else
  86. #define wxSTATEMENT_MACRO_BEGIN do {
  87. #define wxSTATEMENT_MACRO_END } while ( (void)0, 0 )
  88. #endif
  89. /*
  90. Define __WXFUNCTION__ which is like standard __FUNCTION__ but defined as
  91. NULL for the compilers which don't support the latter.
  92. */
  93. #ifndef __WXFUNCTION__
  94. /* TODO: add more compilers supporting __FUNCTION__ */
  95. #if defined(__DMC__)
  96. /*
  97. __FUNCTION__ happens to be not defined within class members
  98. http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485
  99. */
  100. #define __WXFUNCTION__ (NULL)
  101. #elif defined(__GNUC__) || \
  102. (defined(_MSC_VER) && _MSC_VER >= 1300) || \
  103. defined(__FUNCTION__)
  104. #define __WXFUNCTION__ __FUNCTION__
  105. #else
  106. /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */
  107. #define __WXFUNCTION__ (NULL)
  108. #endif
  109. #endif /* __WXFUNCTION__ already defined */
  110. /* Auto-detect variadic macros support unless explicitly disabled. */
  111. #if !defined(HAVE_VARIADIC_MACROS) && !defined(wxNO_VARIADIC_MACROS)
  112. /* Any C99 or C++11 compiler should have them. */
  113. #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
  114. (defined(__cplusplus) && __cplusplus >= 201103L)
  115. #define HAVE_VARIADIC_MACROS
  116. #elif wxCHECK_GCC_VERSION(3,0)
  117. #define HAVE_VARIADIC_MACROS
  118. #elif wxCHECK_VISUALC_VERSION(8)
  119. #define HAVE_VARIADIC_MACROS
  120. #elif wxCHECK_WATCOM_VERSION(1,2)
  121. #define HAVE_VARIADIC_MACROS
  122. #endif
  123. #endif /* !HAVE_VARIADIC_MACROS */
  124. #ifdef HAVE_VARIADIC_MACROS
  125. /*
  126. wxCALL_FOR_EACH(what, ...) calls the macro from its first argument, what(pos, x),
  127. for every remaining argument 'x', with 'pos' being its 1-based index in
  128. *reverse* order (with the last argument being numbered 1).
  129. For example, wxCALL_FOR_EACH(test, a, b, c) expands into this:
  130. test(3, a) \
  131. test(2, b) \
  132. test(1, c)
  133. Up to eight arguments are supported.
  134. (With thanks to https://groups.google.com/d/topic/comp.std.c/d-6Mj5Lko_s/discussion
  135. and http://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros)
  136. */
  137. #define wxCALL_FOR_EACH_NARG(...) wxCALL_FOR_EACH_NARG_((__VA_ARGS__, wxCALL_FOR_EACH_RSEQ_N()))
  138. #define wxCALL_FOR_EACH_NARG_(args) wxCALL_FOR_EACH_ARG_N args
  139. #define wxCALL_FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N
  140. #define wxCALL_FOR_EACH_RSEQ_N() 8, 7, 6, 5, 4, 3, 2, 1, 0
  141. #define wxCALL_FOR_EACH_1(what, x) what(1, x)
  142. #define wxCALL_FOR_EACH_2(what, x, ...) what(2, x) wxCALL_FOR_EACH_1(what, __VA_ARGS__)
  143. #define wxCALL_FOR_EACH_3(what, x, ...) what(3, x) wxCALL_FOR_EACH_2(what, __VA_ARGS__)
  144. #define wxCALL_FOR_EACH_4(what, x, ...) what(4, x) wxCALL_FOR_EACH_3(what, __VA_ARGS__)
  145. #define wxCALL_FOR_EACH_5(what, x, ...) what(5, x) wxCALL_FOR_EACH_4(what, __VA_ARGS__)
  146. #define wxCALL_FOR_EACH_6(what, x, ...) what(6, x) wxCALL_FOR_EACH_5(what, __VA_ARGS__)
  147. #define wxCALL_FOR_EACH_7(what, x, ...) what(7, x) wxCALL_FOR_EACH_6(what, __VA_ARGS__)
  148. #define wxCALL_FOR_EACH_8(what, x, ...) what(8, x) wxCALL_FOR_EACH_7(what, __VA_ARGS__)
  149. #define wxCALL_FOR_EACH_(N, args) \
  150. wxCONCAT(wxCALL_FOR_EACH_, N) args
  151. #define wxCALL_FOR_EACH(what, ...) \
  152. wxCALL_FOR_EACH_(wxCALL_FOR_EACH_NARG(__VA_ARGS__), (what, __VA_ARGS__))
  153. #else
  154. #define wxCALL_FOR_EACH Error_wx_CALL_FOR_EACH_requires_variadic_macros_support
  155. #endif /* HAVE_VARIADIC_MACROS */
  156. #endif /* _WX_CPP_H_ */