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