rootcint handling of "not declared" classes

From: Pasha Murat (murat@cdfsga.fnal.gov)
Date: Tue Oct 28 1997 - 18:07:46 MET


	Hello,

there is a certain problem with rootcint handling of classes it considers
"not defined". To see what the problem is lets assume that we deal with a 
large software system with source codes residing  in many directories 
(a/ and b/ in this example). Suppose sources of class A are located in 
directory a/ :

-------------------------------- A.h
class A : public TObject {
  B  b;
  ClassDef(A,1)
};
--------------------

with class B being described in directory b/ .

Now, we use the following linkdef.h:
-------------------------------------------------- linkdef.h
#ifdef __CINT__
#pragma link off all globals
#pragma link off all functions
#pragma link off all classes
#pragma link C++ class A;
#pragma link C++ class B;
#endif
--------------------------------------------------
then we `cd' into directory a/ and try to create CINT dictionary:

>cd a
>rootcint -f a_cint.cc -c linkdef.h A.h

This generates diagnostics:

Class B: Streamer() not declared
Class B: ShowMembers() not declared

which is fine, however (and this is not fine at all!) A::Streamer method 
generated by rootcint *does not* contain call to B::Streamer:
----------------------------------------------
void A::Streamer(TBuffer &R__b)
{
   // Stream an object of class A.   ***** call to B::Streamer is missing here

   TObject::Streamer(R__b);
}
----------------------------------------------
The example above shows that there is an implicit assumption that there 
is *only one* CINT dictionary for the whole system...
If I want (and it seems to be a pretty reasonable solution) to have a CINT 
dictionary per subdirectory, then to generate CINT dictionary for the files 
in directory a/ it 
is necessary for rootcint to read include files from directory b/. 
Therefore, the generated for a/ CINT dictionary will include B::Streamer. 
However the same function B::Streamer would also be contained in the dictionary 
generated for directory b/ and we end up with having multiple definitions of the
same function and a lot of linker warnings...

One of the ways to resolve this problem is to generate Class::Streamer etc 
functions assuming that *all* the classes involved if not defined on the input 
stream have their dictionaries generated elsewhere. 
I remind that in most of the cases (if not in 100%) correct generation 
of the A::Streamer method *does not* require the definition of the class B to 
be available. To do it it is quite enough to know only the name of the 
class (B in this case).

					Any comments ? Regards, Pasha



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:26:22 MET