linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Multiple declaration problem
@ 2007-02-24 15:49 Shriramana Sharma
  2007-02-27 18:42 ` Glynn Clements
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Shriramana Sharma @ 2007-02-24 15:49 UTC (permalink / raw)
  To: linux-c-programming

[-- Attachment #1: Type: text/plain, Size: 1689 bytes --]

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 #2: multiple-declaration-problem.tar.gz --]
[-- Type: application/gzip, Size: 611 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread
* RE: Multiple declaration problem
@ 2007-02-27 10:50 cyon.john
  0 siblings, 0 replies; 6+ messages in thread
From: cyon.john @ 2007-02-27 10:50 UTC (permalink / raw)
  To: samjnaa, linux-c-programming

Hi,

#ifdef ... #define ... #endif protects you from accidently incuding a
header file twice in a source file.
But since you are including it in different source files, compiler will
not complain, but while linking linker will find that 'b' is defined at
two places and complain.

Can't you use  
		int lawCloseEngine ( int engineID = NONE ) ;

I think that should solve your problem.

Regards,
Cyon P.J.


-----Original Message-----
From: linux-c-programming-owner@vger.kernel.org
[mailto:linux-c-programming-owner@vger.kernel.org] On Behalf Of
Shriramana Sharma
Sent: Saturday, February 24, 2007 9:19 PM
To: linux-c-programming@vger.kernel.org
Subject: Multiple declaration problem

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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-03-07 16:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-02-24 15:49 Multiple declaration problem Shriramana Sharma
2007-02-27 18:42 ` Glynn Clements
2007-02-27 18:57 ` Jesse Ruffin
2007-02-28 15:31 ` Shriramana Sharma
2007-03-07 16:36   ` Glynn Clements
  -- strict thread matches above, loose matches on Subject: below --
2007-02-27 10:50 cyon.john

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).