g ++中的多重定义?

时间:2014-03-03 11:06:38

标签: c gcc makefile g++

代码如下:

global.h

#ifndef GLOBAL_H
#define GLOBAL_H
#include <stdio.h>
int test;

void test_fun(void);
#endif

global.c

#include "global.h"

void test_fun()
{
    printf("%d\n", test);
}

的main.c

#include "global.h"

int main(void)
{
    test_fun();
    test = 1;
    printf("%d\n", test);
}

使用gcc编译器生成文件

main: main.o global.o
    gcc -o main main.o global.o

main.o: main.c global.h
    gcc -c main.c
global.o: global.c global.h
    gcc -c global.c

clean:
    rm -f global.o main.o main

这很有效。

但是,当我将代码更改为C ++时,如下所示:

global.h

#ifndef GLOBAL_H
#define GLOBAL_H
#include <iostream>
int test;

void test_fun(void);
#endif

global.cpp

#include "global.h"

void test_fun()
{
    cout << test
}

的main.cpp

#include "global.h"

int main(void)
{
    test_fun();
    test = 1;
    std::cout << test;
}

使用g ++编译器生成文件

main: main.o global.o
    g++ -o main main.o global.o

main.o: main.cpp global.h
    g++ main.cpp
global.o: global.cpp global.h
    g++ global.cpp

clean:
    rm -f global.o main.o main

上面的代码抛出输出:

global.o:(.bss+0x0): multiple definition of `test'

是什么让这里有所不同?

2 个答案:

答案 0 :(得分:1)

...您正在使用不同的编程语言

答案 1 :(得分:1)

您在{2}中包含的标头中int test;,因此出错。翻译单元main.c(或.cpp取决于所使用的编译器)和global.c都包含global.h,这导致两个目标文件中相同变量的两个定义,因此链接器错误。

test作为test_fun的争论,从而避免使用全局。

如果您必须在TU之间共享变量,请从int test;global.h中删除main.cpp

int test;

并在global.cpp执行

extern int test;

顺便说一句,由于它是一个全局变量,test将被0初始化为main,因此当您test_fun();时,0会被1打印出来{{1}}然后在将其设置为1之后,它将打印{{1}}。

从语言的角度来看,

It's illegal in both C and C++,但是为什么它与C编译器(如GCC)一起工作是因为它们实现了a common extension, a legacy cruft