Это упрощенная версия некоторого кода.
struct
определено в roughStruct.h
.Он имеет static const char * someVar
.someVar
инициализируется за пределами struct
в том же файле.
Другой class roughParse
(определенный в roughParse.h
и реализованный в roughParse.cpp
) намеревается использовать roughStruct
(Для целей этого вопроса он абсолютно ничего не делает)
- Основной файл
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