c ++即使使用extern也可以对变量进行多重定义

时间:2015-11-01 16:11:06

标签: c++

我一直试图修复我的多重定义错误,大多数答案似乎是使用extern但是即使我这样做后错误仍然存​​在

的main.cpp

#include "header.h"

int main(){

ifstream indata;
indata.open(file.c_str());

int x;

while(indata){
    indata >> x;
    print(x);
}

return 0;
}

functions.cpp

#include "header.h"

void print(int x){
    cout << x << endl;
}

header.h

#ifndef _HEADER_H
#define _HEADER_H

#include <fstream>
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

extern string file="testFile.txt";

void print(int x);

#endif

生成文件

all: main

main.o: main.cpp header.h
    g++ -c main.cpp

functions.o: functions.cpp header.h
    g++ -c functions.cpp

main: main.o functions.o
    g++ main.o functions.o -o main

check: all
    ./main

clean:
    rm -f *.o main

我得到的错误信息是

make
g++ -c main.cpp
In file included from main.cpp:1:0:
header.h:11:15: warning: ‘file’ initialized and declared ‘extern’
 extern string file="testFile.txt";
               ^
g++ -c functions.cpp
In file included from functions.cpp:1:0:
header.h:11:15: warning: ‘file’ initialized and declared ‘extern’
 extern string file="testFile.txt";
               ^
g++ main.o functions.o -o main
functions.o:functions.cpp:(.bss+0x0): multiple definition of `file'
main.o:main.cpp:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:10: recipe for target 'main' failed
make: *** [main] Error 1

有人能指出我在正确的方向。

4 个答案:

答案 0 :(得分:4)

extern声明是要向每个翻译单元显示的声明,而不是定义,

请考虑留下

extern string file;
在标题中

,然后将定义移动到其中一个源文件:

string file = "testFile.txt";

答案 1 :(得分:2)

您的初始化程序“覆盖”extern关键字,使该行成为定义而非声明。

你不能吃蛋糕也不能吃。

答案 2 :(得分:1)

在header.h中声明它:

extern string file;

并在.cpp文件中定义:

string file = "testFile.txt";

否则包含header.h的所有内容都有自己的file定义,从而导致`file&#39;&#34;的多重定义。你得到的错误。

答案 3 :(得分:1)

Extern是一个指令,告诉链接器符号的定义在另一个目标文件中可用。 extern是一个声明说明符 - 即它不是一个定义。您不应该定义声明为extern的变量。

作为一种做法,在头文件中定义全局变量并不好。这就是多重​​定义错误的原因。这是因为您的头文件包含在两个cpp文件中。

解决方案:

从header.h中删除     extern string file =“testFile.txt”

添加到functions.cpp   string file =“testFile.txt”

添加到main.cpp     extern声明extern字符串文件;