]> git.saurik.com Git - wxWidgets.git/blame - include/wx/dlimpexp.h
Avoid cyclic includes by forward declaring wxColour.
[wxWidgets.git] / include / wx / dlimpexp.h
CommitLineData
0cc66b6c
VZ
1/*
2 * Name: wx/dlimpexp.h
3 * Purpose: Macros for declaring DLL-imported/exported functions
4 * Author: Vadim Zeitlin
5 * Modified by:
6 * Created: 16.10.2003 (extracted from wx/defs.h)
7 * RCS-ID: $Id$
77ffb593 8 * Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
65571936 9 * Licence: wxWindows licence
0cc66b6c
VZ
10 */
11
12/*
13 This is a C file, not C++ one, do not use C++ comments here!
14 */
15
16#ifndef _WX_DLIMPEXP_H_
17#define _WX_DLIMPEXP_H_
18
b9d4eff6
VS
19#if defined(HAVE_VISIBILITY)
20# define WXEXPORT __attribute__ ((visibility("default")))
21# define WXIMPORT __attribute__ ((visibility("default")))
22#elif defined(__WINDOWS__)
0cc66b6c
VZ
23 /*
24 __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
25 as VC++ and gcc
26 */
27# if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__)
28# define WXEXPORT __declspec(dllexport)
29# define WXIMPORT __declspec(dllimport)
30# else /* compiler doesn't support __declspec() */
31# define WXEXPORT
32# define WXIMPORT
33# endif
34#elif defined(__WXPM__)
35# if defined (__WATCOMC__)
36# define WXEXPORT __declspec(dllexport)
37 /*
38 __declspec(dllimport) prepends __imp to imported symbols. We do NOT
39 want that!
40 */
41# define WXIMPORT
fd928524
DW
42# elif defined(__EMX__)
43# define WXEXPORT
44# define WXIMPORT
0cc66b6c
VZ
45# elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
46# define WXEXPORT _Export
47# define WXIMPORT _Export
48# endif
49#elif defined(__WXMAC__) || defined(__WXCOCOA__)
50# ifdef __MWERKS__
51# define WXEXPORT __declspec(export)
52# define WXIMPORT __declspec(import)
53# endif
7275146d
MW
54#elif defined(__CYGWIN__)
55# define WXEXPORT __declspec(dllexport)
56# define WXIMPORT __declspec(dllimport)
0cc66b6c
VZ
57#endif
58
59/* for other platforms/compilers we don't anything */
60#ifndef WXEXPORT
61# define WXEXPORT
62# define WXIMPORT
63#endif
64
65/*
77ffb593 66 We support building wxWidgets as a set of several libraries but we don't
0cc66b6c
VZ
67 support arbitrary combinations of libs/DLLs: either we build all of them as
68 DLLs (in which case WXMAKINGDLL is defined) or none (it isn't).
69
53a2db12 70 However we have a problem because we need separate WXDLLIMPEXP versions for
0cc66b6c
VZ
71 different libraries as, for example, wxString class should be dllexported
72 when compiled in wxBase and dllimported otherwise, so we do define separate
73 WXMAKING/USINGDLL_XYZ constants for each component XYZ.
74 */
75#ifdef WXMAKINGDLL
76# if wxUSE_BASE
77# define WXMAKINGDLL_BASE
78# endif
79
80# define WXMAKINGDLL_NET
81# define WXMAKINGDLL_CORE
82# define WXMAKINGDLL_ADV
f5a9eef7 83# define WXMAKINGDLL_QA
0cc66b6c 84# define WXMAKINGDLL_HTML
0ae4d121 85# define WXMAKINGDLL_GL
0cc66b6c 86# define WXMAKINGDLL_XML
c846884b 87# define WXMAKINGDLL_XRC
5e4903f5 88# define WXMAKINGDLL_AUI
d4cd6b3e 89# define WXMAKINGDLL_PROPGRID
3b2cb431 90# define WXMAKINGDLL_RICHTEXT
c220a8ec 91# define WXMAKINGDLL_MEDIA
c079af66 92# define WXMAKINGDLL_STC
0cc66b6c
VZ
93#endif /* WXMAKINGDLL */
94
95/*
53a2db12 96 WXDLLIMPEXP_CORE maps to export declaration when building the DLL, to import
0cc66b6c
VZ
97 declaration if using it or to nothing at all if we don't use wxWin as DLL
98 */
99#ifdef WXMAKINGDLL_BASE
100# define WXDLLIMPEXP_BASE WXEXPORT
101# define WXDLLIMPEXP_DATA_BASE(type) WXEXPORT type
5f9c3802
SC
102# if defined(HAVE_VISIBILITY)
103# define WXDLLIMPEXP_INLINE_BASE WXEXPORT
104# else
105# define WXDLLIMPEXP_INLINE_BASE
106# endif
0cc66b6c
VZ
107#elif defined(WXUSINGDLL)
108# define WXDLLIMPEXP_BASE WXIMPORT
109# define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type
5f9c3802
SC
110# if defined(HAVE_VISIBILITY)
111# define WXDLLIMPEXP_INLINE_BASE WXIMPORT
112# else
113# define WXDLLIMPEXP_INLINE_BASE
114# endif
0cc66b6c
VZ
115#else /* not making nor using DLL */
116# define WXDLLIMPEXP_BASE
117# define WXDLLIMPEXP_DATA_BASE(type) type
5f9c3802 118# define WXDLLIMPEXP_INLINE_BASE
0cc66b6c
VZ
119#endif
120
121#ifdef WXMAKINGDLL_NET
122# define WXDLLIMPEXP_NET WXEXPORT
123# define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type
124#elif defined(WXUSINGDLL)
125# define WXDLLIMPEXP_NET WXIMPORT
126# define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type
127#else /* not making nor using DLL */
128# define WXDLLIMPEXP_NET
129# define WXDLLIMPEXP_DATA_NET(type) type
130#endif
131
132#ifdef WXMAKINGDLL_CORE
133# define WXDLLIMPEXP_CORE WXEXPORT
134# define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type
135#elif defined(WXUSINGDLL)
136# define WXDLLIMPEXP_CORE WXIMPORT
137# define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type
138#else /* not making nor using DLL */
139# define WXDLLIMPEXP_CORE
140# define WXDLLIMPEXP_DATA_CORE(type) type
141#endif
142
143#ifdef WXMAKINGDLL_ADV
144# define WXDLLIMPEXP_ADV WXEXPORT
145# define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type
146#elif defined(WXUSINGDLL)
147# define WXDLLIMPEXP_ADV WXIMPORT
148# define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type
149#else /* not making nor using DLL */
150# define WXDLLIMPEXP_ADV
151# define WXDLLIMPEXP_DATA_ADV(type) type
152#endif
153
61639efb
VZ
154#ifdef WXMAKINGDLL_QA
155# define WXDLLIMPEXP_QA WXEXPORT
156# define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type
157#elif defined(WXUSINGDLL)
158# define WXDLLIMPEXP_QA WXIMPORT
159# define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type
160#else /* not making nor using DLL */
161# define WXDLLIMPEXP_QA
162# define WXDLLIMPEXP_DATA_QA(type) type
163#endif
164
0cc66b6c
VZ
165#ifdef WXMAKINGDLL_HTML
166# define WXDLLIMPEXP_HTML WXEXPORT
167# define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type
168#elif defined(WXUSINGDLL)
169# define WXDLLIMPEXP_HTML WXIMPORT
170# define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type
171#else /* not making nor using DLL */
172# define WXDLLIMPEXP_HTML
173# define WXDLLIMPEXP_DATA_HTML(type) type
174#endif
175
176#ifdef WXMAKINGDLL_GL
177# define WXDLLIMPEXP_GL WXEXPORT
178#elif defined(WXUSINGDLL)
179# define WXDLLIMPEXP_GL WXIMPORT
180#else /* not making nor using DLL */
181# define WXDLLIMPEXP_GL
182#endif
183
184#ifdef WXMAKINGDLL_XML
185# define WXDLLIMPEXP_XML WXEXPORT
186#elif defined(WXUSINGDLL)
187# define WXDLLIMPEXP_XML WXIMPORT
188#else /* not making nor using DLL */
189# define WXDLLIMPEXP_XML
190#endif
191
c846884b
RD
192#ifdef WXMAKINGDLL_XRC
193# define WXDLLIMPEXP_XRC WXEXPORT
194#elif defined(WXUSINGDLL)
195# define WXDLLIMPEXP_XRC WXIMPORT
196#else /* not making nor using DLL */
197# define WXDLLIMPEXP_XRC
198#endif
199
5e4903f5
JS
200#ifdef WXMAKINGDLL_AUI
201# define WXDLLIMPEXP_AUI WXEXPORT
202#elif defined(WXUSINGDLL)
203# define WXDLLIMPEXP_AUI WXIMPORT
204#else /* not making nor using DLL */
205# define WXDLLIMPEXP_AUI
206#endif
207
1c4293cb
VZ
208#ifdef WXMAKINGDLL_PROPGRID
209# define WXDLLIMPEXP_PROPGRID WXEXPORT
210#elif defined(WXUSINGDLL)
211# define WXDLLIMPEXP_PROPGRID WXIMPORT
212#else /* not making nor using DLL */
213# define WXDLLIMPEXP_PROPGRID
214#endif
215
3b2cb431
JS
216#ifdef WXMAKINGDLL_RICHTEXT
217# define WXDLLIMPEXP_RICHTEXT WXEXPORT
218#elif defined(WXUSINGDLL)
219# define WXDLLIMPEXP_RICHTEXT WXIMPORT
220#else /* not making nor using DLL */
221# define WXDLLIMPEXP_RICHTEXT
222#endif
223
ff2b312f
RN
224#ifdef WXMAKINGDLL_MEDIA
225# define WXDLLIMPEXP_MEDIA WXEXPORT
226#elif defined(WXUSINGDLL)
227# define WXDLLIMPEXP_MEDIA WXIMPORT
228#else /* not making nor using DLL */
229# define WXDLLIMPEXP_MEDIA
230#endif
231
c079af66
VZ
232#ifdef WXMAKINGDLL_STC
233 #define WXDLLIMPEXP_STC WXEXPORT
234#elif defined(WXUSINGDLL)
235 #define WXDLLIMPEXP_STC WXIMPORT
236#else /* not making nor using DLL */
237 #define WXDLLIMPEXP_STC
238#endif
239
8ece1737
VZ
240/*
241 GCC warns about using __attribute__ (and also __declspec in mingw32 case) on
242 forward declarations while MSVC complains about forward declarations without
243 __declspec for the classes later declared with it, so we need a separate set
244 of macros for forward declarations to hide this difference:
245 */
246#if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__))
0ff20b9f
VS
247 #define WXDLLIMPEXP_FWD_BASE
248 #define WXDLLIMPEXP_FWD_NET
249 #define WXDLLIMPEXP_FWD_CORE
250 #define WXDLLIMPEXP_FWD_ADV
251 #define WXDLLIMPEXP_FWD_QA
0ff20b9f
VS
252 #define WXDLLIMPEXP_FWD_HTML
253 #define WXDLLIMPEXP_FWD_GL
254 #define WXDLLIMPEXP_FWD_XML
255 #define WXDLLIMPEXP_FWD_XRC
256 #define WXDLLIMPEXP_FWD_AUI
d4cd6b3e 257 #define WXDLLIMPEXP_FWD_PROPGRID
0ff20b9f
VS
258 #define WXDLLIMPEXP_FWD_RICHTEXT
259 #define WXDLLIMPEXP_FWD_MEDIA
260 #define WXDLLIMPEXP_FWD_STC
261#else
262 #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE
263 #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET
264 #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE
265 #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV
266 #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA
0ff20b9f
VS
267 #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML
268 #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL
269 #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML
270 #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC
271 #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI
d4cd6b3e 272 #define WXDLLIMPEXP_FWD_PROPGRID WXDLLIMPEXP_PROPGRID
0ff20b9f
VS
273 #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT
274 #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA
275 #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC
276#endif
b5dbe15d 277
0cc66b6c
VZ
278/* for backwards compatibility, define suffix-less versions too */
279#define WXDLLEXPORT WXDLLIMPEXP_CORE
280#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
281
7c77f334
VZ
282/*
283 MSVC up to 6.0 needs to be explicitly told to export template instantiations
284 used by the DLL clients, use this macro to do it like this:
285
286 template <typename T> class Foo { ... };
287 WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
288
16361ec9 289 (notice that currently we only need this for wxBase and wxCore libraries)
7c77f334
VZ
290 */
291#if defined(__VISUALC__) && (__VISUALC__ <= 1200)
292 #ifdef WXMAKINGDLL_BASE
293 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
294 template class WXDLLIMPEXP_BASE decl;
16361ec9
VS
295 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
296 template class WXDLLIMPEXP_CORE decl;
7c77f334
VZ
297 #else
298 /*
299 We need to disable this warning when using this macro, as
53a2db12 300 recommended by Microsoft itself:
7c77f334
VZ
301
302 http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958
303 */
304 #pragma warning(disable:4231)
305
306 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
307 extern template class WXDLLIMPEXP_BASE decl;
16361ec9
VS
308 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
309 extern template class WXDLLIMPEXP_CORE decl;
7c77f334
VZ
310 #endif
311#else /* not VC <= 6 */
312 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl)
16361ec9 313 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl)
7c77f334
VZ
314#endif /* VC6/others */
315
0cc66b6c
VZ
316#endif /* _WX_DLIMPEXP_H_ */
317