]> git.saurik.com Git - wxWidgets.git/blame - docs/html/standard.htm
added a blurb about wxBe
[wxWidgets.git] / docs / html / standard.htm
CommitLineData
97979ddf
JS
1<HTML>
2<HEAD>
3 <TITLE>wxWindows Programmer Style Guide</TITLE>
4</HEAD>
5
6<BODY>
7
8<a name="top"></a>
9
10<font face="Arial, Lucida Sans, Helvetica">
11
12<table width=100% border=4 cellpadding=5 cellspacing=0>
13<tr>
14<td bgcolor="#660000">
15<font size=+1 face="Arial, Lucida Sans, Helvetica" color="#FFFFFF">
16wxWindows Programmer Style Guide
17</font>
18</td>
19</tr>
20</table>
21
22<P>
23
24by <A HREF=mailto:zeitlin@dptmaths.ens-cachan.fr>Vadim Zeitlin</A><P>
25
26This guide is intended for people who are (or intending to start) writing code
27for <A HREF="http://web.ukonline.co.uk/julian.smart/wxwin/" target=_top>wxWindows</A> class library.
28
29<P>
30The guide is separated into two parts: the first one addresses the general
31compatibility issues and is not wxWindows-specific. The advises in this part
32will hopefully help you to write programs which compile and run on greater
33variety of platforms. The second part details the wxWindows code organization and
34its goal it to make wxWindows as uniform as possible without imposing too
35many restrictions on the programmer.
36<P>
37Acknowledgements: This guide is partly based on <A
38HREF=http://www.mozilla.org/docs/tplist/catBuild/portable-cpp.html target=_top>
39C++ portability guide</A> by David Williams.
40
41<P>
42<H3>General C++ Rules</H3>
43<UL>
44 <LI>New or not widely supported C++ features</LI>
45 <OL>
46 <LI><A HREF="#no_templates">Don't use C++ templates</A></LI>
47 <LI><A HREF="#no_exceptions">Don't use C++ exceptions</A></LI>
48 <LI><A HREF="#no_rtti">Don't use RTTI</A></LI>
49 <LI><A HREF="#no_namespaces">Don't use namespaces</A></LI>
50 <LI><A HREF="#no_stl">Don't use STL</A></LI>
51 <LI><A HREF="#no_fordecl">Don't declare variables inside <TT>for()</TT></A></LI>
52 <LI><A HREF="#no_nestedclasses">Don't use nested classes</A></LI>
53 </OL>
54 <BR>
55 <LI>General recommendations</LI>
56 <OL>
57 <LI><A HREF="#no_globals">No global variables with constructor</A></LI>
58 <LI><A HREF="#no_warnings">Turn on all warnings and eradicate them</A></LI>
59 <LI><A HREF="#no_assume_sizeof">Don't rely on <TT>sizeof(int) == 2</TT>...</A></LI>
60 <LI><A HREF="#no_assignment_in_if">No assignments in conditional expressions</A></LI>
61 <LI><A HREF="#no_comment_code">Use <TT>#if 0</TT> rather than comments to temporarily
62 disable blocks of code</A></LI>
63 <LI><A HREF="#no_extra_semicolon">Don't use extra semi-colons on top level</A></LI>
64 </OL>
65 <BR>
66 <LI>Unix/DOS differences</LI>
67 <OL>
68 <LI><A HREF="#use_cpp_ext">Use .cpp for C++ source file extension</A></LI>
69 <LI><A HREF="#no_backslash">Don't use backslash ('\\') in &#35;includes</A></LI>
70 <LI><A HREF="#no_carriagereturn">Avoid carriage returns in cross-platform code</A></LI>
71 <LI><A HREF="#no_caps_in_filenames">Use only lower letter filenames</A></LI>
72 <LI><A HREF="#no_incomplete_files">Terminate the files with a new-line</A></LI>
73 </OL>
74 <BR>
75 <LI>Style choices</LI>
76 <OL>
77 <LI><A HREF="#naming_conv">Naming conventions: use <TT>m_</TT> for members</A></LI>
78 <LI><A HREF="#no_void_param">Don't use <TT>void</TT> for functions without
79 arguments</A></LI>
80 <LI><A HREF="#no_const_int">Don't use <TT>const</TT> for non pointer/reference
81 arguments</A></LI>
82 </OL>
83</UL>
84
85<P>
86
87<H3>wxWindows Rules</H3>
88<UL>
89 <LI>Files location and naming conventions</LI>
90 <OL>
91 <LI><A HREF="#file_locations">File locations</A></LI>
92 <LI><A HREF="#include_guards">Include guards</A></LI>
93 <LI><A HREF="#pch">Precompiled headers</A></LI>
94 </OL>
95
96 <BR>
97 <LI>File layout and indentation</LI>
98 <OL>
99 <LI><A HREF="#wxwin_header">wxWindows standard header</A></LI>
100 <LI><A HREF="#indentation">Indent your code with 4 spaces (no tabs!)</A></LI>
101 <LI><A HREF="#class_decl">Order of parts in a class declarations</A></LI>
102 </OL>
103
104 <BR>
105 <LI>More about naming conventions</LI>
106 <OL>
107 <LI><A HREF="#wx_prefix">Use wx or WX prefix for all public symbols</A></LI>
108 <LI><A HREF="#wxdllexport">Use WXDLLEXPORT with all classes/functions in
109 wxMSW/common code</A></LI>
110 <LI><A HREF="#set_get">Use Set/Get prefixes for accessors</A></LI>
111 </OL>
112
113 <BR>
114 <LI>Miscellaneous</LI>
115 <OL>
116 <LI><A HREF="#forward_decl">Use forward declarations whenever possible</A></LI>
117 <LI><A HREF="#debug_macros">Use debugging macros</A></LI>
118 </OL>
119</UL>
120
121<HR>
122
123<H3>General C++ Rules</H3>
124<UL>
125 <LI>New or not widely supported C++ features</LI>
126
127 <P>The usage of all features in this section is not recommended for one reason: they appeared in C++ relatively recently and are not yet
128supported by all compilers. Moreover, when they're supported, there are
129differences between different vendor's implementations. It's understandable that
130you might love one (or all) of these features, but you surely can write C++
131programs without them. Where possible, workarounds to compensate for absence
132of your favourite C++ abilities are indicated.
133 <P>Just to suppress any doubts that there are compilers which don't support
134these new features, you can think about Win16 (a.k.a. Win 3.1) compilers,
135<I>none</I> of which supports <I>any</I> feature from the list below.
136
137 <OL>
138 <P><LI><A NAME="no_templates"></A><B>Don't use C++ templates</B></LI><P>
139Besides the reasons mentioned above, template usage also makes the
140program compile much slower (200%-300% is not uncommon) and their support
141even in the compilers which have had it for a long time is far from perfect
142(the best example is probably gcc).
143<P><U>Workaround</U>: The things you would like to use templates for are,
144most commonly, polymorphic containers (in the sense that they can contain objects of
145any type without compromising C++ type system, i.e. using <TT>void *</TT>
146is out of question). wxWindows provides <A HREF="TODO">dynamic
147arrays and lists</A> which are sufficient in 99% of cases - please don't hesitate
148to use them. Lack of template is not a reason to use static arrays or
149type-less (passing by <TT>void *</TT>) containers.
150
151 <P><LI><A NAME="no_exceptions"></A><B>Don't use C++ exceptions</B></LI><P>
152The C++ exception system is an error-reporting mechanism. Another reasons not to use it,
153besides portability, are the performance penalty it imposes (small, but, at least for
154current compilers, non-zero), and subtle problems with
155memory/resource deallocation it may create (the place where you'd like to use
156C++ exceptions most of all are the constructors, but you need to be very
157careful in order to be able to do it).
158<P><U>Workaround</U>: there is no real workaround, of course, or the exceptions
159wouldn't have been added to the language. However, there are several rules which
160might help here:<P>
161
162<OL>
163 <LI>Every function returns an integer (or at least boolean) error code.
164 <P>There is no such thing as a function that never fails - even if it can't
165 fail now, it might do it later, when modified to be more powerful/general.
166 Put the <TT>int</TT> or <TT>bool</TT> return type from the very beginning!<P>
167 </LI><LI>Every function you call may fail - check the return code!
168 <P>Never rely on the function's success, always test for a possible error.<P>
169 </LI><LI>Tell the user about the error, don't silently ignore them.
170 <P>Exceptions are always caught and, normally, processed when they're
171 caught. In the same manner, the error return code must always be processed
172 somehow. You may choose to ignore it, but at least tell the user that
173 something wrong happened using <A HREF="TODO"><TT>wxLogError</TT></A> or
174 <A HREF="TODO"><TT>wxLogWarning</TT></A> functions. All wxWindows
175 functions (must) log the error messages on failure - this can be disabled
176 by using <A HREF="TODO">wxLogNull</A> object before calling it.
177 <P>Examples:<UL>
178 <LI><I>Wrong</I>:
179 <PRE>
180void ReadAddressBookFile(const wxString& strName)
181{
182 wxFile file;
183
184 if ( !file.Open(strFile) )
185 return;
186
187 ...process it...
188}
189 </PRE>
190 </LI><LI><I>Correct</I>:
191 <PRE>
192// returns false if the address book couldn't be read
193bool ReadAddressBookFile(const wxString& strName)
194{
195 wxFile file;
196
197 if ( !file.Open(strFile) ) {
198 // wxFile logged an error because file couldn't be opened which
199 // contains the system error code, however it doesn't know what
200 // this file is for and an error message "can't open $GLCW.ADB"
201 // can be quite confusing for the user. Here we say what we mean.
202 wxLogError("Can't read address book from '%s'!",
203 strName.c_str());
204 return false;
205 }
206
207 ...process it...
208
209 return true;
210}
211 </PRE>
212 or, if it's not an error if file doesn't exist (here we could just check
213 its existence, but let's suppose that there is no <TT>wxFile::Exists()</TT>)
214 we can also write:
215 <PRE>
216// returns false if address book file doesn't exist
217bool ReadAddressBookFile(const wxString& strName)
218{
219 wxFile file;
220
221 // start a block inside which all log messages are suppressed
222 {
223 wxLogNull noLog;
224 if ( !file.Open(strFile) )
225 return false;
226 }
227
228 ...process it...
229
230 return true;
231}
232 </PRE></LI>
233 </UL>
234 </OL>
235
236 <P><LI><A NAME="no_rtti"></A><B>Don't use RTTI</B></LI><P>
237RTTI stands for Run-Time Type Information and there is probably no other
238reason not to use it except the portability issue and the fact that it adds
239<TT>sizeof(void *)</TT> bytes to any class having virtual functions (at least,
240in the implementations I'm aware of).
241<P><U>Workaround</U>: use wxWindows RTTI system which allows you to do almost
242everything which the new C++ RTTI, except that, of course, you have to use
243macros instead of the (horrible looking, BTW) <TT>dynamic_cast</TT>.
244
245 <P><LI><A NAME="no_namespaces"></A><B>Don't use namespaces</B></LI><P>
246This topic is subject to change with time, however for the moment all wxWindows
247classes/functions live in the global namespace.
248<P><U>Workaround</U>: None.
249
250 <P><LI><A NAME="no_stl"></A><B>Don't use STL</B></LI><P>
251STL is the new C++ standard library, proposing all kinds of template containers
252and generic algorithm implementations. Templates are the heart (and almost
253everything else) of the library, so its usage is out of question. Besides, even
254with the compilers which do support templates, STL has many of its own problems,
255there are many "not 100% standard compatible" vendor implementations, none of existing debuggers understands its
256complicated data structures, ... the list can go on (almost) forever.
257<P><U>Workaround</U>: Use wxString, dynamic arrays and lists and other wxWindows
258classes. wxString has many of the most often used functions of std::string STL
259class (typedef to be precise).
260 <P><LI><A NAME="no_fordecl"></A><B>Don't declare variables inside <TT>for()
261 </TT></B></LI><P>
262The scope of a variable declared inside <TT>for()</TT> statement changed several
263years ago, however many compilers still will complain about second declaration
264of <TT>i</TT> in the following code:
265<PRE>
266 for ( int i = 0; i < 10; i++ ) {
267 ...
268 }
269
270 ...
271
272 for ( int i = 0; i < 10; i++ ) {
273 ...
274 }
275</PRE>
276Even if it's perfectly legal now.
277<P><U>Workaround</U>: write this instead:
278<PRE>
279 int i;
280 for ( i = 0; i < 10; i++ ) {
281 ...
282 }
283
284 ...
285
286 for ( i = 0; i < 10; i++ ) {
287 ...
288 }
289</PRE>
290
291 <P><LI><A NAME="no_nestedclasses"></A><B>Don't use nested classes</B></LI><P>
292Nested classes are, without doubt, a very good thing because they allow to hide
293"private" (in the sense that they're used only inside the library) classes and,
294generally, put the related things together.
295<P>Unfortunately, some compilers have trouble understanding them, so we must
296sacrifice the ideals of software design to get a working program in this case.
297<P><U>Workaround</U>: instead of
298<PRE>
299 // in the header
300 class PublicLibClass {
301 ...
302 private:
303 class PrivateLibClass { ... } m_object;
304 };
305</PRE>
306you can try the following:
307<PRE>
308 // in the header
309 class PrivateLibClass; // fwd decl
310 class PublicLibClass {
311 ...
312 private:
313 class PrivateLibClass *m_pObject;
314 };
315
316 // in the .cpp file
317 class PrivateLibClass { ... };
318
319 PublicLibClass::PublicLibClass()
320 {
321 m_pObject = new PrivateLibClass;
322
323 ...
324 }
325
326 PublicLibClass::~PublicLibClass()
327 {
328 delete m_pObject;
329 }
330</PRE>
331<P>A nice side effect is that you don't need to recompile all the files
332including the header if you change the PrivateLibClass declaration (it's
333an example of a more general interface/implementation separation idea).
334</OL>
335
336 <BR>
337 <LI>General recommendations</B></LI><P>
338While the recommendations in the previous section may not apply to you if you're
339only working with perfect compilers which implement the very newest directives of
340C++ standard, this section contains compiler- (and language-) independent advice
341which <B>must</B> be followed if you wish to write correct, i.e. working, programs. It
342also contains some C/C++ specific remarks in the end which are less
343important.
344 <OL>
345 <P><LI><A NAME="no_globals"></A><B>No global variables with constructors</B></LI><P>
346In C++, the constructors of global variables are called before the
347<TT>main()</TT> function (or <TT>WinMain()</TT> or any other program entry point)
348starts executing. Thus, there is no possibility to initialize <I>anything</I>
349before the constructor call. The order of construction is largely
350implementation-defined, meaning that there is no guarantee that one global
351object will be initialized before another one (except if they are both defined
352in the same translation unit, i.e. .cpp file). Most importantly, no custom
353memory allocation operators are installed at the moment of execution of global
354variables constructors, so a (less restrictive) rule is that you should have
355no global variables which allocate memory (or do anything else non-trivial) in
356the constructor. Of course, if an object doesn't allocate memory in its constructor
357right now, it may start making it later, so you can only be sure about this if
358you don't use <I>any</I> variables of object (as opposed to simple:
359<TT>int</TT>, ...) types. Example: currently, wxString doesn't allocate memory
360in its default constructor, so you might think that having a global (initially)
361empty wxString is safe. However, if wxString starts allocating some minimal
362amount of memory in its default constructor (which doesn't look unreasonable),
363you would have all kinds of problems with <TT>new</TT>
364and <TT>delete</TT> operators (overloaded in wxWindows), especially because the first <TT>new</TT> called
365is the standard one (before wxWindows overloads them) and <TT>delete</TT> will
366be the overloaded operator.
367
368 <P><LI><A NAME="no_warnings"></A><B>Turn on all warnings and eradicate them</B></LI><P>
369Give the compiler a chance to help you - turn on all warnings! You should always
370use the maximum available warning level of your compiler and understand and
371correct each of them. If, for whatever reasons, a compiler gives a warning on
372some perfectly legal line of code and you can't change it, please insert a
373comment indicating it in the code. Most oftenly, however, all compiler warnings
374may be avoided (not suppressed!) with minimal changes to your code.
375
376 <P><LI><A NAME="no_assume_sizeof"></A><B>Don't rely on <TT>sizeof(int) == 2</TT>...</B></LI><P>
377You should never assume any absolute constraints on data type sizes. Currently,
378we have 16-bit, 32-bit and 64-bit machines and even inside each class data type
379sizes are different. A small table illustrates it quite well:
380<TABLE BORDER COLS=5 WIDTH="100%" NOSAVE >
381<TR>
382 <TD>Architecture/OS</TD>
383 <TD>sizeof(short)</TD>
384 <TD>sizeof(int)</TD>
385 <TD>sizeof(long)</TD>
386 <TD>sizeof(void *)</TD>
387</TR>
388
389<TR>
390 <TD>i386/Windows 3.1</TD>
391 <TD>2</TD>
392 <TD>2</TD>
393 <TD>4</TD>
394 <TD>2 or 4</TD>
395</TR>
396
397<TR>
398 <TD>i386/Windows 95</TD>
399 <TD>2</TD>
400 <TD>4</TD>
401 <TD>4</TD>
402 <TD>4</TD>
403</TR>
404
405<TR>
406 <TD>Merced/Win64</TD>
407 <TD>2</TD>
408 <TD>4</TD>
409 <TD>4</TD>
410 <TD>8</TD>
411</TR>
412
413<TR>
414 <TD>Alpha/Linux</TD>
415 <TD>???</TD>
416 <TD>???</TD>
417 <TD>???</TD>
418 <TD>???</TD>
419</TR>
420</TABLE>
421
422 <P><LI><A NAME="no_assignment_in_if"></A><B>No assignments in conditional expressions</B></LI><P>
423Although close to the heart of many C programmers (I plead guilty), code like
424classical <TT>if ( (c = getchar()) != EOF )</TT> is bad because it prevents you
425from enabling "assignment in conditional expression" warning (see also
426<A HREF="#no_warnings">above</A>) warning which is helpful to detect common
427mistypes like <TT>if ( x = 2 )</TT> instead of <TT>if ( x == 2 )</TT>.
428
429 <P><LI><A NAME="no_comment_code"></A><B>Use <TT>#if 0</TT> rather than comments to temporarily
430 disable blocks of code</B></LI><P>
431If you have to temporarily disable some code, use
432<PRE>
433 #if 0 // VZ: I think this code is unneeded, it probably must be removed
434 ...
435 #endif // 0
436</PRE>
437instead of
438<PRE>
439 /*
440 ...
441 */
442</PRE>
443The reason is simple: if there are any <TT>/* ... */</TT> comments inside
444<TT>...</TT> the second version will, of course, miserably fail.
445
446 <P><LI><A NAME="no_extra_semicolon"></A><B>Don't use extra semi-colons on top level</B></LI><P>
447Some compilers don't pay any attention to extra semicolons on top level, as in
448<PRE>
449 class Foo { };;
450</PRE>
451while others complain loudly about it. Of course, you would rarely put 2
452semicolons yourself, but it may happen if you're using a macro
453(<TT>IMPLEMENT_something</TT>, for example) which already has a ';' inside and
454put another one after it.
455 </OL>
456
457 <BR>
458 <LI>Unix/DOS differences</B></LI><P>
459 Two operating systems supported by wxWindows right now are (different flavours
460of) Unix and Windows 3.1/95/NT (although Mac, OS/2 and other ports exist/are
461being developed as well). The main differences between them are summarized
462here.
463
464 <OL>
465 <P><LI><A NAME="use_cpp_ext"></A><B>Use .cpp for C++ source file extension</B></LI><P>
466There is, unfortunately, no standard exceptions for C++ source files. Different
467people use .C, .cc, .cpp, .cxx, .c++ and probably several others I forgot. Some
468compilers don't care about extension, but there are also other ones which can't
469be made to compile any file with "wrong" extension. Such compilers are very
470common in DOS/Windows land, that's why the .cpp extension is the least likely to
471cause any problems - it's the standard one under DOS and will probably be
472accepted by any Unix compiler as well (any counter examples?). The extension
473for the header files is .h.
474
475 <P><LI><A NAME="no_backslash"></A><B>Don't use backslash ('\\') in &#35;includes</B></LI><P>
476Although it's too silly to mention, please don't use backslashes in
477<TT>&#35;include</TT> preprocessor statement. Even not all Windows compilers accept
478it, without speaking about all other ones.
479
480 <P><LI><A NAME="no_carriagereturn"></A><B>Avoid carriage returns in cross-platform code</B></LI><P>
481This problem will hopefully not arise at all, with CVS taking care of this
482stuff, however it's perhaps not useless to remember that many Unix compilers
483(including, but not limited to, gcc) don't accept carriage returns
484(= <Ctrl-M> = '\r') in C/C++ code.
485
486 <P><LI><A NAME="no_caps_in_filenames"></A><B>Use only lower case filenames</B></LI><P>
487DOS/Windows 3.1 isn't case sensitive, Windows 95/NT are case preserving, but not
488case sensitive. To avoid all kinds of problems with compiling under Unix (or
489any other fully case-sensitive OS), please use only lower case letters in the
490filenames.
491
492 <P><LI><A NAME="no_incomplete_files"></A><B>Terminate the files with a new-line</B></LI><P>
493While DOS/Windows compilers don't seem to mind, their Unix counterparts don't
494like files without terminating new-line. Such files also give a warning message
495when loaded to vim (the Unix programmer's editor of choice :-)), so please think
496about terminating the last line.
497 </OL>
498
499 <BR>
500 <LI>Style choices</B></LI><P>
501 All wxWindows specific style guidelines are specified in the next
502section, here are the choices which are not completely arbitrary,
503but have some deeper and not wxWindows-specific meaning.
504
505 <OL>
506 <P><LI><A NAME="naming_conv"></A><B>Naming conventions: use <TT>m_</TT> for members</B></LI><P>
507It's extremely important to write readable code. One of the first steps in this
508direction is the choice of naming convention. It may be quite vague or strictly
509define the names of all the variables and function in the program, however it
510surely must somehow allow the reader to distinguish between variable and
511functions and local variables and member variables from the first glance.
512<P>The first requirement is commonly respected, but for some strange reasons, the
513second isn't, even if it's much more important because, after all, the immediate
514context usually allows you to distinguish a variable from a function in
515C/C++ code. On the other hand, you <I>cannot</I> say what <TT>x</TT> in the
516following code fragment is:
517<PRE>
518 void Foo::Bar(int x_)
519 {
520 ...
521
522 x = x_;
523
524 ...
525 }
526</PRE>
527It might be either a local variable (unluckily the function is too long so you
528don't see the variable declarations when you look at <TT>x = x_</TT> line), a
529member variable or a global variable - you have no way of knowing.
530<P>The wxWindows naming convention gives you, the reader of the code, much more
531information about <TT>x</TT>. In the code above you know that it's a local
532variable because:<P>
533<OL>
534 <LI>global variables are always prefixed with <TT>g_</TT></LI>
535 <LI>member variables are always prefixed with <TT>m_</TT></LI>
536 <LI>static variables are always prefixed with <TT>s_</TT></LI>
537</OL>
538<P>Examples:
539<PRE>
540 extern int g_x; // of course, 'x' is not the best name for a global...
541
542 void Bar()
543 {
544 int x;
545 }
546
547 class Foo {
548 public:
549 void SetX(int x) { m_x = x; }
550 private:
551 int m_x;
552 };
553</PRE>
554As you see, it also solves once and for all the old C++ programmer's question:
555how to call <TT>SetX()</TT> parameter? The answer is simple: just call it
556<TT>x</TT> because there is no ambiguity with <TT>Foo::m_x</TT>.
557<P>The prefixes can be combined to give <TT>ms_</TT> and <TT>gs_</TT> for static
558member (a.k.a. class) variables and static global variables.
559<P>The convention is, of course, completely worthless if it is not followed:
560nothing like being sure that <TT>x</TT> is a local variable in the code fragment
561above and discovering later the following lines in the header:
562<PRE>
563 class Foo {
564 ...
565 int x; // I don't like wxWindows naming convention
566 };
567</PRE>
568Please do use these prefixes, they make your code much easier to read. Also
569please notice that it has nothing to do with the so-called <I>Hungarian notation</I>
570which is used in wxMSW part of wxWindows code and which encodes the <I>type</I>
571of the variable in its name - it is actually quite useful in C, but has little
572or no sense in C++.
573
574 <P><LI><A NAME="no_void_param"></A><B>Don't use <TT>void</TT> for functions without
575 arguments</B></LI><P>
576In ANSI C, <TT>void Foo()</TT> takes an arbitrary number of arbitrarily typed
577arguments (although the form <TT>void Foo(...)</TT> is preferred) and <TT>void
578Foo(void)</TT> doesn't take any arguments. In C++, however, the situation is
579different and both declarations are completely equivalent. As there is no need
580to write <TT>void</TT> in this situation, let's not write it - it can only be
581confusing and create an impression that it really means something when it's not
582at all the case.
583
584 <P><LI><A NAME="no_const_int"></A><B>Don't use <TT>const</TT> for non pointer/reference
585 arguments</B></LI><P>
586In both C and C++ an argument passed by value cannot be modified - or, more
587precisely, if it is modified in the called function, only the local copy is
588really changed, not the caller's variable. So, semantically speaking, there is
589no difference between <TT>void Foo(int)</TT> and <TT>void Foo(const int)</TT>.
590However, the <TT>const</TT> keyword is confusing here, adds nothing to the code
591and even cannot be removed if <TT>Foo()</TT> is virtual and overridden (because
592the names are mangled differently). So, <I>for arguments passed by value</I>
593you shouldn't use <TT>const</TT>.
594<P>Of course, it doesn't apply to functions such as
595<TT>void PrintMessage(const char *text)</TT> where <TT>const</TT> is mandatory.
596 </OL>
597</UL>
598
599<P>
600
601<H3>wxWindows rules</H3>
602<UL>
603 <P><LI>File location and naming conventions</LI><P>
604 <OL>
605 <P><LI><A NAME="file_locations"></LI><B>File locations</B><P>
606The wxWindows files for each supported platform have their own subdirectories
607in "include" and "src". So, for example, there is "src/msw", "include/gtk"
608etc. There are also two special subdirectories called "common" and
609"generic". The common subdirectory contains the files which are platform
610independent (wxObject, wxString, ...) and the generic one the generic
611implementations of GUI widgets, i.e. those which use only other wxWindows
612classes to implement them. For the platforms where the given functionality
613cannot be implemented natively, the generic implementation is used and the native
614one is used for the others. As I feel that it becomes a bit too confusing,
615here is an example: wxMessageBox function is implemented natively under
616Windows (where it just calls MessageBox API), but there is also a generic
617implementation which is used under, for example, GTK. A generic class should
618normally have a name that distinguishes it from any platform-specific implementation.
619A #define will allow wxGenericMessageDialog to be wxMessageDialog on some
620platforms, for example.
621
622<P>This scheme applies not only for the .cpp files, but also for the headers.
623However, as the program using wxWindows should (ideally) not use any
624"<TT>&#35;ifdef &lt;platform&gt;</TT>" at all, the headers are always included with
625"<TT>&#35;include &lt;wx/msgdlg.h&gt;</TT>" (for example). This file, in turn, includes
626the right header for given platform. Any new headers should conform to this
627setup as well to allow including <TT>&lt;wx/foo.h&gt;</TT> on any platform.<P>
628
629Note that wxWindows implementation files should use quotes when including wxWindows
630headers, not angled brackets. Applications should use angled brackets. There
631is a reason for it (can anyone remember what this is?).
632
633 <P><LI><A NAME="include_guards"></LI><B>Include guards</B><P>
634To minimize the compile time C++ programmers often use so called include
635guards: for example, in the header file foo.h you might have
636
637<PRE>
638&#35;ifndef _FOO_H_
639&#35;define _FOO_H_
640
641... all header contents ...
642
643&#35;endif
644 //_FOO_H_
645</PRE>
646
647In this way, the header will only be included once for the compilation
648of any .cpp (of course, it still will be included many times for the
649compilation of the whole project, so it has nothing to do with precompiled
650headers). wxWindows is no exception and also uses include guards which should use
651the above form, except for top-level headers which include files with identical
652names, in which case you should use _FOO_H_BASE_.
653
654 <P><LI><A NAME="pch"></LI><B>Precompiled headers</B><P>
655The precompiled headers greatly (we're speaking about orders of hundreds of
656percent here) reduce the compilation time. wxWindows uses them if the target
657compiler supports them (it knows about MS Visual C++, Borland C++ and g++).
658You should include all the headers included from <TT><wx/wx_prec.h></TT> only
659inside "<TT>&#35;if !USE_PRECOMP</TT>" to avoid unnecessary overhead in the case
660when the precompiled headers are used.<P>
661
662The start of a cpp implementation file after the heading might look like this:<P>
663
664<PRE>
665&#35;ifdef __GNUG__
666&#35;pragma implementation "bitmap.h"
667&#35;endif
668
669// For compilers that support precompilation, includes "wx.h".
670&#35;include "wx/wxprec.h"
671
672&#35;ifdef __BORLANDC__
673&#35;pragma hdrstop
674&#35;endif
675
676&#35;ifndef WX_PRECOMP
677&#35;include &lt;stdio.h&gt;
678&#35;include "wx/setup.h"
679&#35;include "wx/list.h"
680&#35;include "wx/utils.h"
681&#35;include "wx/app.h"
682&#35;include "wx/palette.h"
683&#35;include "wx/bitmap.h"
684&#35;include "wx/icon.h"
685&#35;endif
686
687&#35;include "wx/msw/private.h"
688&#35;include "assert.h"
689</PRE>
690
691
692<P>Any header file should containg the following lines:
693<PRE>
694&#35;ifdef __GNUG__
695 &#35;pragma interface "foo.h"
696&#35;endif
697</PRE>
698and the corresponding .cpp file:
699<PRE>
700&#35;ifdef __GNUG__
701 &#35;pragma implementation "foo.h"
702&#35;endif
703</PRE> for g++ compilation.
704 </OL>
705
706 <P><LI>File layout and indentation</LI><P>
707 <OL>
708 <P><LI><A NAME="wxwin_header"></LI><B>wxWindows standard header</B> <a href="header.txt">here</a>. The
709copyright holder is the original author. It is assumed the author does not assert copyright,
710under the terms of the wxWindows licence. This is a legal interpretation of the informal
711usage 'public domain' (the copyright holder does not assert the copyright).<P>
712 <P><LI><A NAME="indentation"></LI><B>Indent your code with 4 spaces (no tabs!)</B>
713 <P><LI><A NAME="class_decl"></LI><B>Order of parts in a class declarations</B><P>
714 </OL>
715
716 <P><LI>More about naming conventions</LI><P>
717 <OL>
718 <P><LI><A NAME="wx_prefix"></LI><B>Use wx or WX prefix for all public symbols</B>.
719wx should be used for functions and classes, WX for macros.
720 <P><LI><A NAME="wxdllexport"</LI><B>Use WXDLLEXPORT with all classes/functions in
721 wxMSW/common code</B>
722The title says it all - every public (in the sense that it is not internal to
723the library) function or class should have WXDLLEXPORT macro in its
724declaration to allow compilation of wxWindows as shared library. For example:<P>
725
726<pre>
727bool WXDLLEXPORT wxYield(void);
728class WXDLLEXPORT MyClass; // (for forward declarations and real declarations)
729WXDLLEXPORT_DATA(extern wxApp*) wxTheApp;
730</pre>
731
732The reason for the strange syntax for data is that some compilers use different
733keyword ordering for exporting data.
734
735<P>There also several other places where you should take care of shared
736library case: all IMPLEMENT_xxx macros which are usually used in the
737corresponding .cpp files must be taken inside
738"<TT>&#35;if !USE_SHARED_LIBRARY</TT>" and in the <TT>&#35;if USE_SHARED_LIBRARY</TT>
739case you should put them inside <TT>common/cmndata.cpp</TT> file.
740
741 <P><LI><A NAME="set_get"></LI><B>Use Set/Get prefixes for accessors</B><P>
742There is a convention in wxWindows to prefix the accessors (i.e. any simple, in
743general, inline function which does nothing else except changing or returning
744the value of a member variable) with either <TT>Set</TT> or <TT>Get</TT>.
745 </OL>
746
747 <P><LI>Miscellaneous</LI><P>
748 <OL>
749 <P><LI><A NAME="forward_decl"></LI><B>Use forward declarations whenever possible</B><P>
750It's really a trivial piece of advice, but remember that using forward declarations
751instead of including the header of corresponding class is better because not
752only does it minimize the compile time, it also simplifies the dependencies
753between different source files.
754<P>On a related subject, in general, you should try not to include other
755headers from a header file.
756
757 <P><LI><A NAME="debug_macros"></LI><B>Use debugging macros</B><P>
758wxWindows provides the debugging macros <TT>wxASSERT, wxFAIL</TT> and
759<TT>wxCHECK_RET</TT> in <TT><wx/wx.h></TT> file. Please use them as often as
760you can - they will never do you any harm but can greatly simplify the bug
761tracking both for you and for others.
762<P>Also, please use <TT>wxFAIL_MSG("not implemented")</TT> instead of writing
763stubs for not (yet) implemented functions which silently return incorrect
764values - otherwise, a person using a not implemented function has no idea that
765it is, in fact, not implemented.
766<P>As all debugging macros only do something useful if the symbol
767<TT>__DEBUG__</TT> is defined, you should compile your programs in debug mode to profit
768from them.
769 </OL>
770</UL>
771
772<P>
773
774<HR>
775Please send any comments to <A HREF=mailto:zeitlin@dptmaths.ens-cachan.fr>Vadim Zeitlin</A>.
776
777</font>
778
779</BODY>
780</HTML>