Re: Multiple declaration problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The problem, as I understand it, is that you are instantiating a variable in a 
header and you need it's value in another header.


It seems that the best solution would instead be to move the variable 
instantiation into the source file, keep the declaration in the header if you 
still need visibility. To synchronize the value of the variable and the 
function, you should use a #define or const. Using a variable will not give 
you a dynamic default anyway, as it is evaluated at compile time. Try 
something like this:

in the header:
#define DEFAULT_ENGINE = NONE //could use const int CURRENT_ENGINE
int lawCurrentEngine; //declaration only, if you need it

in source:
lawCurrentEngine = DEFAULT_ENGINE; // NONE has been enum-med previously

in other header:
int lawCloseEngine ( int engineID = DEFAULT_ENGINE );

Now that I've written this, it looks like you may be trying to get a dynamic 
default. You can't actually do that, but you can get close with a file static 
variable. i.e.:

in source:

static currentEngine = NONE;

int lawCloseEngine( int engineID = NONE ) {
	if( engineID == NONE ){
		if (currentEngine != NONE) lawRealCloseEngine(currentEngine);
		currentEngine = NONE;
		return SUCCESS;
	} else {
		lawRealCloseEngine(engineID);
		return SUCCESS;
	}
	return FAIL;	//Should never happen.
}

Hope this helps

Jesse Ruffin
AJP Services

On Saturday 24 February 2007 10:49, Shriramana Sharma wrote:
> Hello. I have a problem with multiple declaration in a project I am
> working on. I have constructed a similar testcase which throws the same
> kind of error. Please see the files in the attachment. -g or -g3 did not
> give any useful debugging symbols, I don't know why. The following is
> the session transcript:
>
> $ ls
> main.cpp  myheader.cpp  myheader.h
> $ g++ -c main.cpp
> $ g++ -c myheader.cpp
> $ g++ -o main main.o myheader.o
> myheader.o:(.data+0x0): multiple definition of `b'
> main.o:(.data+0x0): first defined here
> collect2: ld returned 1 exit status
> $ mv main.cpp main.c
> $ mv myheader.cpp myheader.c
> $ rm *.o
> $ gcc -c main.c
> $ gcc -c myheader.c
> $ gcc -o main main.o myheader.o
> myheader.o:(.rodata+0x0): multiple definition of `a'
> main.o:(.rodata+0x0): first defined here
> myheader.o:(.data+0x0): multiple definition of `b'
> main.o:(.data+0x0): first defined here
> collect2: ld returned 1 exit status
>
> In my project, I need to put the following statement in a header file:
>
> int lawCurrentEngine = NONE ; // NONE has been enum-med previously
>
> because I need to declare a function
>
> int lawCloseEngine ( int engineID = lawCurrentEngine ) ;
>
> I include the header file containing these two lines in two cpp files,
> and I get a multiple definition error for lawCurrentEngine just like in
> the given test case. If I push the lawCurrentEngine declaration to one
> of the cpp-s (it's not needed in the other cpp) I am unable to provide
> the default argument for the lawCloseEngine which can be done only in
> the header.
>
> I don't understand how I am getting such an error when I have used the
> #ifndef #define #endif technique as per good programming practice.
>
> Please help,
>
> Thanks.
>
> Shriramana Sharma.

Attachment: pgp5bSS3YUgGy.pgp
Description: PGP signature


[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux