Re: Header multiple inclusion error
Jean-Paul Saman <[email protected]>
| Newsgroups | gmane.comp.video.videolan.libdvbpsi.devel |
|---|---|
| Message-ID | <CAK9US3DCDEzSaR0Rt0M8QG0DyYjF3NkWDTQJ7B=5e8DL3T29kQ@mail.gmail.com> |
On Tue, May 14, 2013 at 11:29 AM, Andrey Utkin < [email protected]> wrote: > 2013/5/14 Jean-Paul Saman <[email protected]>: > > Andrey, > > > > On Sat, May 11, 2013 at 10:54 PM, Andrey Utkin > > <[email protected]> wrote: > >> > >> I consider forcing compilation fail in case of multiple inclusion not > >> correct. > >> You can see in other projects include guards without "else" block, > >> which result in silently compiling and working correctly. > >> To further justify my position, i'll give an example. > >> We have two classes - A and B, both of which utilize some dvbpsi > >> objects, let's say dvbpsi_t, in their data members or function > >> signatures. Thus they both have to include dvbpsi.h in their .h files. > >> Then we have class C, which includes A and B as data members, so it > >> has to include A.h and B.h in its .h. Voila, multiple inclusion, and > >> libdvbpsi forces compilation fail. > > > > > > You should not include the dvbpsi.h header files inside the .h file for > this > > situation. Include it only in the > > .c files is the right solutions in your example. > > Could you please explain what is the problem/risk of applying the > change i proposed and using libdvbpsi the way i described? Currently I > see none. > In case of multiple inclusion of a header file is usually a sign that the design is flawed. Your design probably exposes more internal details than it needs too. It could easily lead to circular dependencies. It is cleaner to have header files as much as possible declared inside the *.c file. This is my 2cts on the subject. And with workaround you gave, i see the problem of having type > dvbpsi_t undefined in headers. As i explained, i need this type as > classes datamembers. > You could do this: file a.c #include <dvbpsi.h> #include "a.h" /* .. other stuff ... */ Then file b.c #include <dvbpsi.h> #include "b.h" /* .. other stuff ... */ And finally: file "c.c" #include <dvbpsi.h> #include "a.h" #include "b.h" #include "c.h" /* other stuff */ > -- > Andrey Utkin > Kind regards, Jean-Paul Saman. _______________________________________________ libdvbpsi-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libdvbpsi-devel