]> git.saurik.com Git - wxWidgets.git/blame - include/wx/cpp.h
The object size page now has full position attribute editing.
[wxWidgets.git] / include / wx / cpp.h
CommitLineData
cdd8d745
VZ
1/*
2 * Name: wx/cpp.h
3 * Purpose: Various preprocessor helpers
4 * Author: Vadim Zeitlin
5 * Created: 2006-09-30
6 * RCS-ID: $Id$
7 * Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
8 * Licence: wxWindows licence
9 */
10
11/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
12
13#ifndef _WX_CPP_H_
14#define _WX_CPP_H_
15
16/* wxCONCAT works like preprocessor ## operator but also works with macros */
17#define wxCONCAT_HELPER(text, line) text ## line
cdd8d745 18
47eab2f2
VZ
19#define wxCONCAT(x1, x2) \
20 wxCONCAT_HELPER(x1, x2)
21#define wxCONCAT3(x1, x2, x3) \
22 wxCONCAT(wxCONCAT(x1, x2), x3)
23#define wxCONCAT4(x1, x2, x3, x4) \
24 wxCONCAT(wxCONCAT3(x1, x2, x3), x4)
25#define wxCONCAT5(x1, x2, x3, x4, x5) \
26 wxCONCAT(wxCONCAT4(x1, x2, x3, x4), x5)
27#define wxCONCAT6(x1, x2, x3, x4, x5, x6) \
28 wxCONCAT(wxCONCAT5(x1, x2, x3, x4, x5), x6)
29#define wxCONCAT7(x1, x2, x3, x4, x5, x6, x7) \
30 wxCONCAT(wxCONCAT6(x1, x2, x3, x4, x5, x6), x7)
31#define wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8) \
32 wxCONCAT(wxCONCAT7(x1, x2, x3, x4, x5, x6, x7), x8)
33#define wxCONCAT9(x1, x2, x3, x4, x5, x6, x7, x8, x9) \
34 wxCONCAT(wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8), x9)
1894e49f 35
cdd8d745
VZ
36/* wxSTRINGIZE works as the preprocessor # operator but also works with macros */
37#define wxSTRINGIZE_HELPER(x) #x
38#define wxSTRINGIZE(x) wxSTRINGIZE_HELPER(x)
39
84206bbb
VZ
40/* a Unicode-friendly version of wxSTRINGIZE_T */
41#define wxSTRINGIZE_T(x) wxAPPLY_T(wxSTRINGIZE(x))
42
25859335
VZ
43/*
44 Special workarounds for compilers with broken "##" operator. For all the
45 other ones we can just use it directly.
46 */
47#ifdef wxCOMPILER_BROKEN_CONCAT_OPER
48 #define wxPREPEND_L(x) L ## x
49 #define wxAPPEND_i64(x) x ## i64
50 #define wxAPPEND_ui64(x) x ## ui64
51#endif /* wxCOMPILER_BROKEN_CONCAT_OPER */
52
cdd8d745
VZ
53/*
54 Helper macros for wxMAKE_UNIQUE_NAME: normally this works by appending the
55 current line number to the given identifier to reduce the probability of the
56 conflict (it may still happen if this is used in the headers, hence you
57 should avoid doing it or provide unique prefixes then) but we have to do it
58 differently for VC++
59 */
60#if defined(__VISUALC__) && (__VISUALC__ >= 1300)
61 /*
62 __LINE__ handling is completely broken in VC++ when using "Edit and
63 Continue" (/ZI option) and results in preprocessor errors if we use it
64 inside the macros. Luckily VC7 has another standard macro which can be
65 used like this and is even better than __LINE__ because it is globally
66 unique.
67 */
68# define wxCONCAT_LINE(text) wxCONCAT(text, __COUNTER__)
69#else /* normal compilers */
70# define wxCONCAT_LINE(text) wxCONCAT(text, __LINE__)
71#endif
72
73/* Create a "unique" name with the given prefix */
74#define wxMAKE_UNIQUE_NAME(text) wxCONCAT_LINE(text)
75
bde626ce
VZ
76/*
77 This macro can be passed as argument to another macro when you don't have
78 anything to pass in fact.
79 */
80#define wxEMPTY_PARAMETER_VALUE /* Fake macro parameter value */
81
a6ebdba6
VZ
82/*
83 Define __WXFUNCTION__ which is like standard __FUNCTION__ but defined as
84 NULL for the compilers which don't support the latter.
85 */
86#ifndef __WXFUNCTION__
87 /* TODO: add more compilers supporting __FUNCTION__ */
88 #if defined(__DMC__)
89 /*
90 __FUNCTION__ happens to be not defined within class members
91 http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485
92 */
93 #define __WXFUNCTION__ (NULL)
94 #elif defined(__GNUC__) || \
95 (defined(_MSC_VER) && _MSC_VER >= 1300) || \
96 defined(__FUNCTION__)
97 #define __WXFUNCTION__ __FUNCTION__
98 #else
99 /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */
100 #define __WXFUNCTION__ (NULL)
101 #endif
102#endif /* __WXFUNCTION__ already defined */
103
28efe654 104#endif /* _WX_CPP_H_ */
cdd8d745 105