My point on this.

I took a look at gtkwidget.c and gtkcontainer.c. 
GtkWidget has a parent reference to GtkContainer so it should have
circular header files. 

It turns out they avoid the cycle by defining the parent member of
GtkWidget as a GtkWidget instead of what it should be (GtkContaienr).

Therefore my opinion on the cycles is that there should not be
unsolvable typedef cycles ( with .h, -priv.h and .c) in a properly
designed program, because these cycles represents solid cycles in your
Class atlas; which (as I can remember) should be avoided as possible. If
one is detected, VALA should throw an error -- even if vala can handle
it; it should throw an warning for this poor design.

Then for the 'combination of header guards', I suggest to have one
single header file collecting all these ill typedefs, with a syntax
like 
valac --cycle-typedefs={file-to-collect.h} CODE.

(without this parameter, vala can simply panic on cycle typedefs)



Regards,

Yu
On Sun, 2009-01-11 at 16:04 +0100, Jürg Billeter wrote:
> On Sun, 2009-01-11 at 16:41 +0200, Arto Karppinen wrote:
> > Jürg Billeter wrote:
> > >  * Header file interdependencies
> > >    Header files often depend on other header files and sometimes these
> > >    dependencies form cycles. These cycles are currently detected by the
> > >    compiler and resolved as far as possible - for example, by moving
> > >    typedefs to other header files and reordering includes.
> > > 
> > >    While this works in many cases, there are situations that cannot be
> > >    solved with the current approach, depending on what type you declare
> > >    in what .vala file. There are also situations that could be solved
> > >    with the current approach but are not implemented yet; it would
> > >    complicate the code even further.
> > 
> > It should be possible to handle the typedef problem by simply defining 
> > all typedefs before any includes in .h files and putting all includes 
> > after typedefs. Something like this:
> > 
> > #ifndef __HEADER__
> > #define __HEADER__
> > 
> > // ALL typedefs here.
> > typedef gint my_int;
> > typedef void (*functionpointer) (gint i);
> > typedef struct _MyClass MyClass;
> > 
> > // ALL includes here.
> > #include "something.h"
> > #include "other.h"
> > 
> > // Everything else below
> > struct _MyClass {
> >     ...
> > };
> > 
> > void function_a(gint a, gint b);
> > 
> > #endif
> > 
> > If you do this, then it does not matter in which order you include
> > the 
> > headers, typedefs are always defined as long as you include the
> > correct 
> > header. The point of this ordering is to achieve a situation where
> > all 
> > typedefs are defined before any other part of the header files are 
> > parsed by the compiler. Once all typedefs are defined, it does not 
> > matter in which order the rest of the headers are parsed.
> 
> This does not work in all cases, unfortunately. A simple example is if
> the parameter type of a delegate is declared in another file.
> 
I don't understand this example.


> Another example is the situation where you have class A declared in
> A.vala and class B declared in B.vala. B is a subclass of A, so it needs
> to include "A.h". A has a method that takes an object of type B as
> argument, so it needs to include "B.h".
> 

This is the Gtk example above.
> The issue now occurs with the combination of header guards to avoid
> multiple inclusion. If you first include "A.h" from some .c file, it
> will process the typedef for the struct A, then include B.h, which will
> add the typedef for struct B.
> 
> B.h will then try to include A.h, however, nothing will be processed as
> the header guard prevents multiple inclusion. The following definition
> of the struct B requires the definition of struct A, which will only be
> processed after B.h has been read completely, so this will result in a C
> compiler error.
> 
> Jürg
> 
> _______________________________________________
> Vala-list mailing list
> [email protected]
> http://mail.gnome.org/mailman/listinfo/vala-list

_______________________________________________
Vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to