Added package with the documentation and the examples
[lwc.git] / doc / E.One-Definition-Rule
blobc7b56fceeba408087ad514d560f78d7d2b3f93c2
2 The ODR is the one that sais that functions shouldn't appear
3 in header files.  The exceptions are:
5 1. 'static inline' functions
6 ~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~~
8 'static inline' functions are very useful.  They can be defined in
9 header files but their code only exists in the object files that use
10 them. 'inline' may not be obeyed by the compiler, but the effect
11 still works.
13 in lwc you can say:
15         // header file
17         class A {
18         static inline int f ();
19         };
21         int A.f ()
22         {
23                 // ...
24         }
27 2. embedded functions
28 ~~ ~~~~~~~~ ~~~~~~~~~
30 Functions defined in the definition of a class, are converted
31 to 'static inline's by lwc. As in C++, it's ok to have these
32 in header files.
34         // header file
36         class A {
37                 int f () { /* ... */ }
38         };
41 3. auto functions
42 ~~ ~~~~ ~~~~~~~~~
44 Definitions of auto functions can appear in header files. lwc
45 puts those functions in linkonce sections.
47         // header file
49         class A {
50         auto
51         virtual int f ();
52         };
54         int A.f ()
55         {
56                 // ...
57         }
59 4. member functions of template classes
60 ~~ ~~~~~~ ~~~~~~~~~ ~~ ~~~~~~~~ ~~~~~~~
62 Their specializations are placed in linkonce sections as well.
64         // header file
66         template class T {
67         auto
68         virtual X f ();
69         };
71         X T.f ()
72         {
73                 // ...
74         }
76 5. linkonce specifier
77 ~~ ~~~~~~~~ ~~~~~~~~~
79 Functions explictly declared linkonce:
81         // header file
83         linkonce int f ()
84         {
85                 // ...
86         }
88                                                         Carl Rosmann