c & c++ default global variable linkage, multiple

2019-01-22 18:23发布

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++?

4条回答
闹够了就滚
2楼-- · 2019-01-22 18:54

There are three ways for resolution of problem:

  1. If variable a is the same in both files, you must declare it as extern in all files except one. extern keyword says to linker that this name is located in another files.

  2. You may use static keyword to limit scope of variable to one file. In which it is declared.

  3. Or you may use nameless namespace.

查看更多
倾城 Initia
3楼-- · 2019-01-22 18:55

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.

查看更多
\"骚年 ilove
4楼-- · 2019-01-22 19:02

g++ compiler is more strict then gcc compiler. It also depends on version of gcc, may be higher version of gcc i.e. 4.X onwards it can give same error.

Use extern to avoid

查看更多
smile是对你的礼貌
5楼-- · 2019-01-22 19:03

It's illegal in both, but C compilers generally implement an extension. See this answer.

查看更多
登录 后发表回答