【问题标题】:c++ multiple definition of variable even with externc ++变量的多重定义,即使使用extern
【发布时间】:2015-11-01 16:11:06
【问题描述】:

我一直在尝试修复我的多重定义错误,大多数答案似乎是使用 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

有人可以在这里指出正确的方向吗?

【问题讨论】:

标签: c++


【解决方案1】:

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

考虑什么都不留下

extern string file;

在标题中,然后将定义移动到源文件之一:

string file = "testFile.txt";

【讨论】:

    【解决方案2】:

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

    你不能一边吃蛋糕一边吃。

    【讨论】:

      【解决方案3】:

      在header.h中声明:

      extern string file;
      

      并在 .cpp 文件中定义它:

      string file = "testFile.txt";
      

      否则包含 header.h 的所有内容都将有自己的file 定义,从而导致您得到“multiple definition of `file'”错误。

      【讨论】:

        【解决方案4】:

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

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

        解决方案:

        从 header.h 中删除 外部字符串文件="testFile.txt"

        添加到functions.cpp 字符串文件="testFile.txt"

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 1970-01-01
          • 2018-12-28
          相关资源
          最近更新 更多