我一直试图修复我的多重定义错误,大多数答案似乎是使用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
有人能指出我在正确的方向。
答案 0 :(得分:4)
extern声明是要向每个翻译单元显示的声明,而不是定义,
请考虑留下
extern string file;
在标题中,然后将定义移动到其中一个源文件:
string file = "testFile.txt";
答案 1 :(得分:2)
答案 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字符串文件;