代码如下:
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'
是什么让这里有所不同?
答案 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。