当只有一个定义/声明时,标头声明变量的多堆定义错误

时间:2017-08-23 10:46:17

标签: c++ c++11 makefile

我有一个头文件,我已经定义了一个结构及其变量'editor',并在多个文件中使用它。我没有在其他地方宣布它,但它给了我多个声明错误。我也尝试使用#ifndef,但无济于事。

这是我的头文件:

editorlib.h

#ifndef ED_LIB
#define ED_LIB

//#include files

struct terminalProperties {
    int rows,cols;
    struct termios origTerm;
    int mode;
}editor;
int TERMINATE=0;

//function definitions

#endif

我的editorlib.cpp

#ifndef EDITORLIBRARY_H
#define EDITORLIBRARY_H
#include "editorLibrary.h"

getAttr() {
    tcgetattr(STDIN_FILENO, TCSAFLUSH, &editor.origterm);
}
//further code
#endif

驱动程序文件vi_editor.cpp:

#ifndef MAIN_H
#define MAIN_H

#include "editorLibrary.h"
int main(){

    //some code

    while(1){
        //some code
        if(TERMINATE)
            break;
    }
    //some code
    return 0;
}

#endif

我的normal.cpp:

#ifndef NORMALMODE_H
#define NORMALMODE_H
#include "editorLibrary.h"

void normalMode() {
    editor.mode = 1;
    //further code
}
#endif

我的command.cpp:

#ifndef COMMANDMODE_H
#define COMMANDMODE_H
#include "editorLibrary.h"

void commandMode() {
    editor.mode = 2;
    //further code
}
#endif

类似地,我还有一些其他文件,我没有声明编辑器变量,只是以与上面类似的方式使用它。我似乎无法找到它告诉我多重声明的原因。

1 个答案:

答案 0 :(得分:0)

  

标头声明变量的多堆定义

这已经违反了One Definition Rule。简单的答案是“不要”。您只能在单个.cpp文件中通过extern define 在标头中声明