faq.xml: Replace references to C++0x with C++11.
[gcc.git] / libstdc++-v3 / doc / html / manual / source_code_style.html
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Coding Style</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"/><meta name="keywords" content="&#10; ISO C++&#10; , &#10; library&#10; "/><meta name="keywords" content="&#10; ISO C++&#10; , &#10; runtime&#10; , &#10; library&#10; "/><link rel="home" href="../index.html" title="The GNU C++ Library"/><link rel="up" href="appendix_contributing.html" title="Appendix A.  Contributing"/><link rel="prev" href="source_organization.html" title="Directory Layout and Source Conventions"/><link rel="next" href="source_design_notes.html" title="Design Notes"/></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Coding Style</th></tr><tr><td align="left"><a accesskey="p" href="source_organization.html">Prev</a> </td><th width="60%" align="center">Appendix A. 
4 Contributing
5
6 </th><td align="right"> <a accesskey="n" href="source_design_notes.html">Next</a></td></tr></table><hr/></div><div class="section" title="Coding Style"><div class="titlepage"><div><div><h2 class="title"><a id="contrib.coding_style"/>Coding Style</h2></div></div></div><p>
7 </p><div class="section" title="Bad Identifiers"><div class="titlepage"><div><div><h3 class="title"><a id="coding_style.bad_identifiers"/>Bad Identifiers</h3></div></div></div><p>
8 Identifiers that conflict and should be avoided.
9 </p><div class="literallayout"><p><br/>
10       This is the list of names <span class="quote"><span class="quote">reserved to the<br/>
11       implementation</span></span> that have been claimed by certain<br/>
12       compilers and system headers of interest, and should not be used<br/>
13       in the library. It will grow, of course.  We generally are<br/>
14       interested in names that are not all-caps, except for those like<br/>
15       "_T"<br/>
16 <br/>
17       For Solaris:<br/>
18       _B<br/>
19       _C<br/>
20       _L<br/>
21       _N<br/>
22       _P<br/>
23       _S<br/>
24       _U<br/>
25       _X<br/>
26       _E1<br/>
27       ..<br/>
28       _E24<br/>
29 <br/>
30       Irix adds:<br/>
31       _A<br/>
32       _G<br/>
33 <br/>
34       MS adds:<br/>
35       _T<br/>
36 <br/>
37       BSD adds:<br/>
38       __used<br/>
39       __unused<br/>
40       __inline<br/>
41       _Complex<br/>
42       __istype<br/>
43       __maskrune<br/>
44       __tolower<br/>
45       __toupper<br/>
46       __wchar_t<br/>
47       __wint_t<br/>
48       _res<br/>
49       _res_ext<br/>
50       __tg_*<br/>
51 <br/>
52       SPU adds:<br/>
53       __ea<br/>
54 <br/>
55       For GCC:<br/>
56 <br/>
57       [Note that this list is out of date. It applies to the old<br/>
58       name-mangling; in G++ 3.0 and higher a different name-mangling is<br/>
59       used. In addition, many of the bugs relating to G++ interpreting<br/>
60       these names as operators have been fixed.]<br/>
61 <br/>
62       The full set of __* identifiers (combined from gcc/cp/lex.c and<br/>
63       gcc/cplus-dem.c) that are either old or new, but are definitely<br/>
64       recognized by the demangler, is:<br/>
65 <br/>
66       __aa<br/>
67       __aad<br/>
68       __ad<br/>
69       __addr<br/>
70       __adv<br/>
71       __aer<br/>
72       __als<br/>
73       __alshift<br/>
74       __amd<br/>
75       __ami<br/>
76       __aml<br/>
77       __amu<br/>
78       __aor<br/>
79       __apl<br/>
80       __array<br/>
81       __ars<br/>
82       __arshift<br/>
83       __as<br/>
84       __bit_and<br/>
85       __bit_ior<br/>
86       __bit_not<br/>
87       __bit_xor<br/>
88       __call<br/>
89       __cl<br/>
90       __cm<br/>
91       __cn<br/>
92       __co<br/>
93       __component<br/>
94       __compound<br/>
95       __cond<br/>
96       __convert<br/>
97       __delete<br/>
98       __dl<br/>
99       __dv<br/>
100       __eq<br/>
101       __er<br/>
102       __ge<br/>
103       __gt<br/>
104       __indirect<br/>
105       __le<br/>
106       __ls<br/>
107       __lt<br/>
108       __max<br/>
109       __md<br/>
110       __method_call<br/>
111       __mi<br/>
112       __min<br/>
113       __minus<br/>
114       __ml<br/>
115       __mm<br/>
116       __mn<br/>
117       __mult<br/>
118       __mx<br/>
119       __ne<br/>
120       __negate<br/>
121       __new<br/>
122       __nop<br/>
123       __nt<br/>
124       __nw<br/>
125       __oo<br/>
126       __op<br/>
127       __or<br/>
128       __pl<br/>
129       __plus<br/>
130       __postdecrement<br/>
131       __postincrement<br/>
132       __pp<br/>
133       __pt<br/>
134       __rf<br/>
135       __rm<br/>
136       __rs<br/>
137       __sz<br/>
138       __trunc_div<br/>
139       __trunc_mod<br/>
140       __truth_andif<br/>
141       __truth_not<br/>
142       __truth_orif<br/>
143       __vc<br/>
144       __vd<br/>
145       __vn<br/>
146 <br/>
147       SGI badnames:<br/>
148       __builtin_alloca<br/>
149       __builtin_fsqrt<br/>
150       __builtin_sqrt<br/>
151       __builtin_fabs<br/>
152       __builtin_dabs<br/>
153       __builtin_cast_f2i<br/>
154       __builtin_cast_i2f<br/>
155       __builtin_cast_d2ll<br/>
156       __builtin_cast_ll2d<br/>
157       __builtin_copy_dhi2i<br/>
158       __builtin_copy_i2dhi<br/>
159       __builtin_copy_dlo2i<br/>
160       __builtin_copy_i2dlo<br/>
161       __add_and_fetch<br/>
162       __sub_and_fetch<br/>
163       __or_and_fetch<br/>
164       __xor_and_fetch<br/>
165       __and_and_fetch<br/>
166       __nand_and_fetch<br/>
167       __mpy_and_fetch<br/>
168       __min_and_fetch<br/>
169       __max_and_fetch<br/>
170       __fetch_and_add<br/>
171       __fetch_and_sub<br/>
172       __fetch_and_or<br/>
173       __fetch_and_xor<br/>
174       __fetch_and_and<br/>
175       __fetch_and_nand<br/>
176       __fetch_and_mpy<br/>
177       __fetch_and_min<br/>
178       __fetch_and_max<br/>
179       __lock_test_and_set<br/>
180       __lock_release<br/>
181       __lock_acquire<br/>
182       __compare_and_swap<br/>
183       __synchronize<br/>
184       __high_multiply<br/>
185       __unix<br/>
186       __sgi<br/>
187       __linux__<br/>
188       __i386__<br/>
189       __i486__<br/>
190       __cplusplus<br/>
191       __embedded_cplusplus<br/>
192       // long double conversion members mangled as __opr<br/>
193       // http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html<br/>
194       __opr<br/>
195     </p></div></div><div class="section" title="By Example"><div class="titlepage"><div><div><h3 class="title"><a id="coding_style.example"/>By Example</h3></div></div></div><div class="literallayout"><p><br/>
196       This library is written to appropriate C++ coding standards. As such,<br/>
197       it is intended to precede the recommendations of the GNU Coding<br/>
198       Standard, which can be referenced in full here:<br/>
199 <br/>
200       <a class="link" href="http://www.gnu.org/prep/standards/standards.html#Formatting">http://www.gnu.org/prep/standards/standards.html#Formatting</a><br/>
201 <br/>
202       The rest of this is also interesting reading, but skip the "Design<br/>
203       Advice" part.<br/>
204 <br/>
205       The GCC coding conventions are here, and are also useful:<br/>
206       <a class="link" href="http://gcc.gnu.org/codingconventions.html">http://gcc.gnu.org/codingconventions.html</a><br/>
207 <br/>
208       In addition, because it doesn't seem to be stated explicitly anywhere<br/>
209       else, there is an 80 column source limit.<br/>
210 <br/>
211       <code class="filename">ChangeLog</code> entries for member functions should use the<br/>
212       classname::member function name syntax as follows:<br/>
213 <br/>
214 <code class="code"><br/>
215 1999-04-15  Dennis Ritchie  &lt;dr@att.com&gt;<br/>
216 <br/>
217       * src/basic_file.cc (__basic_file::open): Fix thinko in<br/>
218       _G_HAVE_IO_FILE_OPEN bits.<br/>
219 </code><br/>
220 <br/>
221       Notable areas of divergence from what may be previous local practice<br/>
222       (particularly for GNU C) include:<br/>
223 <br/>
224       01. Pointers and references<br/>
225       <code class="code"><br/>
226         char* p = "flop";<br/>
227         char&amp; c = *p;<br/>
228           -NOT-<br/>
229         char *p = "flop";  // wrong<br/>
230         char &amp;c = *p;      // wrong<br/>
231       </code><br/>
232 <br/>
233       Reason: In C++, definitions are mixed with executable code. Here,<br/>
234       <code class="code">p</code> is being initialized, not <code class="code">*p</code>.  This is near-universal<br/>
235       practice among C++ programmers; it is normal for C hackers<br/>
236       to switch spontaneously as they gain experience.<br/>
237 <br/>
238       02. Operator names and parentheses<br/>
239       <code class="code"><br/>
240         operator==(type)<br/>
241           -NOT-<br/>
242         operator == (type)  // wrong<br/>
243       </code><br/>
244 <br/>
245       Reason: The <code class="code">==</code> is part of the function name. Separating<br/>
246       it makes the declaration look like an expression.<br/>
247 <br/>
248       03. Function names and parentheses<br/>
249       <code class="code"><br/>
250         void mangle()<br/>
251           -NOT-<br/>
252         void mangle ()  // wrong<br/>
253       </code><br/>
254 <br/>
255       Reason: no space before parentheses (except after a control-flow<br/>
256       keyword) is near-universal practice for C++. It identifies the<br/>
257       parentheses as the function-call operator or declarator, as<br/>
258       opposed to an expression or other overloaded use of parentheses.<br/>
259 <br/>
260       04. Template function indentation<br/>
261       <code class="code"><br/>
262         template&lt;typename T&gt;<br/>
263           void<br/>
264           template_function(args)<br/>
265           { }<br/>
266           -NOT-<br/>
267         template&lt;class T&gt;<br/>
268         void template_function(args) {};<br/>
269       </code><br/>
270 <br/>
271       Reason: In class definitions, without indentation whitespace is<br/>
272       needed both above and below the declaration to distinguish<br/>
273       it visually from other members. (Also, re: "typename"<br/>
274       rather than "class".)  <code class="code">T</code> often could be <code class="code">int</code>, which is<br/>
275       not a class. ("class", here, is an anachronism.)<br/>
276 <br/>
277       05. Template class indentation<br/>
278       <code class="code"><br/>
279         template&lt;typename _CharT, typename _Traits&gt;<br/>
280           class basic_ios : public ios_base<br/>
281           {<br/>
282           public:<br/>
283             // Types:<br/>
284           };<br/>
285           -NOT-<br/>
286         template&lt;class _CharT, class _Traits&gt;<br/>
287         class basic_ios : public ios_base<br/>
288           {<br/>
289           public:<br/>
290             // Types:<br/>
291           };<br/>
292           -NOT-<br/>
293         template&lt;class _CharT, class _Traits&gt;<br/>
294           class basic_ios : public ios_base<br/>
295         {<br/>
296           public:<br/>
297             // Types:<br/>
298         };<br/>
299       </code><br/>
300 <br/>
301       06. Enumerators<br/>
302       <code class="code"><br/>
303         enum<br/>
304         {<br/>
305           space = _ISspace,<br/>
306           print = _ISprint,<br/>
307           cntrl = _IScntrl<br/>
308         };<br/>
309           -NOT-<br/>
310         enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };<br/>
311       </code><br/>
312 <br/>
313       07. Member initialization lists<br/>
314       All one line, separate from class name.<br/>
315 <br/>
316       <code class="code"><br/>
317         gribble::gribble()<br/>
318         : _M_private_data(0), _M_more_stuff(0), _M_helper(0)<br/>
319         { }<br/>
320           -NOT-<br/>
321         gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0)<br/>
322         { }<br/>
323       </code><br/>
324 <br/>
325       08. Try/Catch blocks<br/>
326       <code class="code"><br/>
327         try<br/>
328           {<br/>
329             //<br/>
330           }<br/>
331         catch (...)<br/>
332           {<br/>
333             //<br/>
334           }<br/>
335           -NOT-<br/>
336         try {<br/>
337           //<br/>
338         } catch(...) {<br/>
339           //<br/>
340         }<br/>
341       </code><br/>
342 <br/>
343       09. Member functions declarations and definitions<br/>
344       Keywords such as extern, static, export, explicit, inline, etc<br/>
345       go on the line above the function name. Thus<br/>
346 <br/>
347       <code class="code"><br/>
348       virtual int<br/>
349       foo()<br/>
350       -NOT-<br/>
351       virtual int foo()<br/>
352       </code><br/>
353 <br/>
354       Reason: GNU coding conventions dictate return types for functions<br/>
355       are on a separate line than the function name and parameter list<br/>
356       for definitions. For C++, where we have member functions that can<br/>
357       be either inline definitions or declarations, keeping to this<br/>
358       standard allows all member function names for a given class to be<br/>
359       aligned to the same margin, increasing readability.<br/>
360 <br/>
361 <br/>
362       10. Invocation of member functions with "this-&gt;"<br/>
363       For non-uglified names, use <code class="code">this-&gt;name</code> to call the function.<br/>
364 <br/>
365       <code class="code"><br/>
366       this-&gt;sync()<br/>
367       -NOT-<br/>
368       sync()<br/>
369       </code><br/>
370 <br/>
371       Reason: Koenig lookup.<br/>
372 <br/>
373       11. Namespaces<br/>
374       <code class="code"><br/>
375       namespace std<br/>
376       {<br/>
377         blah blah blah;<br/>
378       } // namespace std<br/>
379 <br/>
380       -NOT-<br/>
381 <br/>
382       namespace std {<br/>
383         blah blah blah;<br/>
384       } // namespace std<br/>
385       </code><br/>
386 <br/>
387       12. Spacing under protected and private in class declarations:<br/>
388       space above, none below<br/>
389       i.e.<br/>
390 <br/>
391       <code class="code"><br/>
392       public:<br/>
393         int foo;<br/>
394 <br/>
395       -NOT-<br/>
396       public:<br/>
397 <br/>
398         int foo;<br/>
399       </code><br/>
400 <br/>
401       13. Spacing WRT return statements.<br/>
402       no extra spacing before returns, no parenthesis<br/>
403       i.e.<br/>
404 <br/>
405       <code class="code"><br/>
406       }<br/>
407       return __ret;<br/>
408 <br/>
409       -NOT-<br/>
410       }<br/>
411 <br/>
412       return __ret;<br/>
413 <br/>
414       -NOT-<br/>
415 <br/>
416       }<br/>
417       return (__ret);<br/>
418       </code><br/>
419 <br/>
420 <br/>
421       14. Location of global variables.<br/>
422       All global variables of class type, whether in the "user visible"<br/>
423       space (e.g., <code class="code">cin</code>) or the implementation namespace, must be defined<br/>
424       as a character array with the appropriate alignment and then later<br/>
425       re-initialized to the correct value.<br/>
426 <br/>
427       This is due to startup issues on certain platforms, such as AIX.<br/>
428       For more explanation and examples, see <code class="filename">src/globals.cc</code>. All such<br/>
429       variables should be contained in that file, for simplicity.<br/>
430 <br/>
431       15. Exception abstractions<br/>
432       Use the exception abstractions found in <code class="filename">functexcept.h</code>, which allow<br/>
433       C++ programmers to use this library with <code class="literal">-fno-exceptions</code>.  (Even if<br/>
434       that is rarely advisable, it's a necessary evil for backwards<br/>
435       compatibility.)<br/>
436 <br/>
437       16. Exception error messages<br/>
438       All start with the name of the function where the exception is<br/>
439       thrown, and then (optional) descriptive text is added. Example:<br/>
440 <br/>
441       <code class="code"><br/>
442       __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));<br/>
443       </code><br/>
444 <br/>
445       Reason: The verbose terminate handler prints out <code class="code">exception::what()</code>,<br/>
446       as well as the typeinfo for the thrown exception. As this is the<br/>
447       default terminate handler, by putting location info into the<br/>
448       exception string, a very useful error message is printed out for<br/>
449       uncaught exceptions. So useful, in fact, that non-programmers can<br/>
450       give useful error messages, and programmers can intelligently<br/>
451       speculate what went wrong without even using a debugger.<br/>
452 <br/>
453       17. The doxygen style guide to comments is a separate document,<br/>
454       see index.<br/>
455 <br/>
456       The library currently has a mixture of GNU-C and modern C++ coding<br/>
457       styles. The GNU C usages will be combed out gradually.<br/>
458 <br/>
459       Name patterns:<br/>
460 <br/>
461       For nonstandard names appearing in Standard headers, we are constrained<br/>
462       to use names that begin with underscores. This is called "uglification".<br/>
463       The convention is:<br/>
464 <br/>
465       Local and argument names:  <code class="literal">__[a-z].*</code><br/>
466 <br/>
467       Examples:  <code class="code">__count  __ix  __s1</code><br/>
468 <br/>
469       Type names and template formal-argument names: <code class="literal">_[A-Z][^_].*</code><br/>
470 <br/>
471       Examples:  <code class="code">_Helper  _CharT  _N</code><br/>
472 <br/>
473       Member data and function names: <code class="literal">_M_.*</code><br/>
474 <br/>
475       Examples:  <code class="code">_M_num_elements  _M_initialize ()</code><br/>
476 <br/>
477       Static data members, constants, and enumerations: <code class="literal">_S_.*</code><br/>
478 <br/>
479       Examples: <code class="code">_S_max_elements  _S_default_value</code><br/>
480 <br/>
481       Don't use names in the same scope that differ only in the prefix,<br/>
482       e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names.<br/>
483       (The most tempting of these seem to be and "_T" and "__sz".)<br/>
484 <br/>
485       Names must never have "__" internally; it would confuse name<br/>
486       unmanglers on some targets. Also, never use "__[0-9]", same reason.<br/>
487 <br/>
488       --------------------------<br/>
489 <br/>
490       [BY EXAMPLE]<br/>
491       <code class="code"><br/>
492 <br/>
493       #ifndef  _HEADER_<br/>
494       #define  _HEADER_ 1<br/>
495 <br/>
496       namespace std<br/>
497       {<br/>
498         class gribble<br/>
499         {<br/>
500         public:<br/>
501           gribble() throw();<br/>
502 <br/>
503           gribble(const gribble&amp;);<br/>
504 <br/>
505           explicit<br/>
506           gribble(int __howmany);<br/>
507 <br/>
508           gribble&amp;<br/>
509           operator=(const gribble&amp;);<br/>
510 <br/>
511           virtual<br/>
512           ~gribble() throw ();<br/>
513 <br/>
514           // Start with a capital letter, end with a period.<br/>
515           inline void<br/>
516           public_member(const char* __arg) const;<br/>
517 <br/>
518           // In-class function definitions should be restricted to one-liners.<br/>
519           int<br/>
520           one_line() { return 0 }<br/>
521 <br/>
522           int<br/>
523           two_lines(const char* arg)<br/>
524           { return strchr(arg, 'a'); }<br/>
525 <br/>
526           inline int<br/>
527           three_lines();  // inline, but defined below.<br/>
528 <br/>
529           // Note indentation.<br/>
530           template&lt;typename _Formal_argument&gt;<br/>
531             void<br/>
532             public_template() const throw();<br/>
533 <br/>
534           template&lt;typename _Iterator&gt;<br/>
535             void<br/>
536             other_template();<br/>
537 <br/>
538         private:<br/>
539           class _Helper;<br/>
540 <br/>
541           int _M_private_data;<br/>
542           int _M_more_stuff;<br/>
543           _Helper* _M_helper;<br/>
544           int _M_private_function();<br/>
545 <br/>
546           enum _Enum<br/>
547             {<br/>
548               _S_one,<br/>
549               _S_two<br/>
550             };<br/>
551 <br/>
552           static void<br/>
553           _S_initialize_library();<br/>
554         };<br/>
555 <br/>
556         // More-or-less-standard language features described by lack, not presence.<br/>
557       # ifndef _G_NO_LONGLONG<br/>
558         extern long long _G_global_with_a_good_long_name;  // avoid globals!<br/>
559       # endif<br/>
560 <br/>
561         // Avoid in-class inline definitions, define separately;<br/>
562         // likewise for member class definitions:<br/>
563         inline int<br/>
564         gribble::public_member() const<br/>
565         { int __local = 0; return __local; }<br/>
566 <br/>
567         class gribble::_Helper<br/>
568         {<br/>
569           int _M_stuff;<br/>
570 <br/>
571           friend class gribble;<br/>
572         };<br/>
573       }<br/>
574 <br/>
575       // Names beginning with "__": only for arguments and<br/>
576       //   local variables; never use "__" in a type name, or<br/>
577       //   within any name; never use "__[0-9]".<br/>
578 <br/>
579       #endif /* _HEADER_ */<br/>
580 <br/>
581 <br/>
582       namespace std<br/>
583       {<br/>
584         template&lt;typename T&gt;  // notice: "typename", not "class", no space<br/>
585           long_return_value_type&lt;with_many, args&gt;<br/>
586           function_name(char* pointer,               // "char *pointer" is wrong.<br/>
587                         char* argument,<br/>
588                         const Reference&amp; ref)<br/>
589           {<br/>
590             // int a_local;  /* wrong; see below. */<br/>
591             if (test)<br/>
592             {<br/>
593               nested code<br/>
594             }<br/>
595 <br/>
596             int a_local = 0;  // declare variable at first use.<br/>
597 <br/>
598             //  char a, b, *p;   /* wrong */<br/>
599             char a = 'a';<br/>
600             char b = a + 1;<br/>
601             char* c = "abc";  // each variable goes on its own line, always.<br/>
602 <br/>
603             // except maybe here...<br/>
604             for (unsigned i = 0, mask = 1; mask; ++i, mask &lt;&lt;1) {<br/>
605               // ...<br/>
606             }<br/>
607           }<br/>
608 <br/>
609         gribble::gribble()<br/>
610         : _M_private_data(0), _M_more_stuff(0), _M_helper(0)<br/>
611         { }<br/>
612 <br/>
613         int<br/>
614         gribble::three_lines()<br/>
615         {<br/>
616           // doesn't fit in one line.<br/>
617         }<br/>
618       } // namespace std<br/>
619       </code><br/>
620     </p></div></div></div><div class="navfooter"><hr/><table width="100%" summary="Navigation footer"><tr><td align="left"><a accesskey="p" href="source_organization.html">Prev</a> </td><td align="center"><a accesskey="u" href="appendix_contributing.html">Up</a></td><td align="right"> <a accesskey="n" href="source_design_notes.html">Next</a></td></tr><tr><td align="left" valign="top">Directory Layout and Source Conventions </td><td align="center"><a accesskey="h" href="../index.html">Home</a></td><td align="right" valign="top"> Design Notes</td></tr></table></div></body></html>