Ошибка связывания при использовании структур в отдельном заголовке - PullRequest
1 голос
/ 25 мая 2019

Это упрощенная версия некоторого кода.

  1. struct определено в roughStruct.h.Он имеет static const char * someVar.someVar инициализируется за пределами struct в том же файле.

  2. Другой class roughParse (определенный в roughParse.h и реализованный в roughParse.cpp) намеревается использовать roughStruct (Для целей этого вопроса он абсолютно ничего не делает)

  3. Основной файл roughMain.cpp намеревается использовать class roughParse для работы на struct roughStruct. (Опять здесь это делаетничего.)

Код не компилируется.

Насколько я понимаю, ошибка происходит потому, что roughStruct составляет include в roughMain.cpp и roughParse.cpp. Мне нужно пояснение здесь - Я не понимаю, как это может быть из-за следующего пункта. После долгих проб и ошибок, следующее исправляет ошибка:
//defining the const inline and not outside
 constexpr static const char *someVar="abcd";

или

//using constructor to initialize and not outside
roughStruct()
    {
        someVar="abcd";
    }

Оба подхода не работают для const char *, замененного на const string.
Почему неt они?
Как вы инициализируете static const string затем?

Второй подход не кажется идеальным, поскольку структуры предназначены для хранения данных, хотя я буду использовать его, если это единственный способ.Но опять же, это не решает проблему для строк.

Но самое главное , почему эти изменения устраняют ошибку компоновки ?

Что касается пункта 4, если roughStruct был включен дважды, он все равно будетв приведенных выше решениях, поскольку они не меняют директивы #includeТаким образом, пункт 4 не является причиной верно?

Код:

Структура:

//roughStruct.h


#ifndef ROUGHSTRUCT_H
#define ROUGHSTRUCT_H

#include<string>

struct roughStruct {
    //this is the critical thing
    static const char *someVar;
//    static std::string someStringVar;
};

const char *someVar = "abcd";


#endif //ROUGHSTRUCT_H


Этокласс анализатора:

//roughParse.h

#ifndef ROUGHPARSE_H
#define ROUGHPARSE_H

#include "roughStruct.h"

class roughParse {

    //had some code here that was implmented in roughParse.cpp
};


#endif //ROUGHPARSE_H
//roughParse.cpp

#include "roughParse.h"
#include<iostream>
using std::cout;
using std::endl;

//had some code here implementing roughParse.h

Основной файл:

//roughMain.cpp


#include "roughStruct.h"
#include "roughParse.h"

int main()
{
//had some code here that used roughparse and roughStruct
    return 0;
}

CMakeLists.txt:

...

add_executable(
       project
        ${SOME_DIR}roughMain.cpp
        ${SOME_DIR}roughParse.h
        ${SOME_DIR}roughParse.cpp
        ${SOME_DIR}roughStruct.h

)
...

Ошибка CMake:

//ignore the line nos.
CMakeFiles/test/roughParse.cpp.o:project/test/roughStruct.h:13: multiple definition of `someVar'
CMakeFiles/test/roughMain.cpp.o:project/test/roughStruct.h:13: first defined here

Env
g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04) 7.4.0
CMake: версия 3.14.3
IDE: CLion ver 2019.1.3

...