Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c & c++ default global variable linkage, multiple declaration & definition problem

For example:

code1.c / .cpp

int a;  // ... and so on 

code2.c / .cpp

int a;  int main(void) {     return 0; } 

go to compile:

$gcc code1.c code2.c      # this is fine $  $g++ code1.cpp code2.cpp  # this is dead /tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a' /tmp/ccnIOmPC.o:(.bss+0x0): first defined here collect2: ld returned 1 exit status 

Is there any global variable linkage difference between C & C++?

like image 549
Bossliaw Avatar asked Jun 16 '11 11:06

Bossliaw


1 Answers

It's not strictly legal. int a; is a tentative definition in C. You are allowed multiple tentative definitions and at most one non-tentative definition per translation unit of each object with external linkage in C, but only one definition across all translation units in a program.

It is a commonly implemented extension to allow tentative definitions across multiple translation units in C so long as not more than one translation unit contains a non-tentative definition, but it's not strictly standard.

In C++ int a; is just a definition - there's no concept of tentative - and it's still illegal to have multiple definitions of an object across the translation units of a program.

For the C case, you may wish to look at this question.

like image 136
CB Bailey Avatar answered Sep 20 '22 07:09

CB Bailey