Я новичок в C ++ и пытаюсь попрактиковаться с заголовками и пространствами имен. В частности, я хотел создать разные модули со своими собственными пространствами имен, чтобы я мог использовать одну программу для просмотра других без смешивания имен. Я воспользовался советом из этого другого вопроса , и он отлично работает с функциями, но когда я получаю константу, я получаю "ошибку переопределения"
2 соответствующих файла:
//mainHeader.h
#pragma once
#include <iostream>
#include <string>
#include <sstream>
namespace primes {
int isPrime(int a);
}
namespace CONST {
typedef unsigned long long int LONGINT;
double pi;
}
namespace E1 {
int main();
}
namespace E2 {
int main();
}
//CONSTANTS.cpp
#include "mainHeader.h"
namespace CONST{
pi = 3.14159265;
typedef unsigned long long int LONGINT;
}
Конечно, есть основная функция, которая в основном пуста, и 2 других файла .cpp, которые работают нормально. Он скомпилировался и работал как хотел до того, как я создал CONSTANTS.cpp и решил протестировать то же самое для констант
Проблема в том, что этот код говорит мне, что число pi в CONSTANTS.cpp определено неправильно:
отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int
Однако, если я добавлю тип в определение в CONSTANTS
выдает эту переопределенную ошибку.
> e1.obj : error LNK2005: "double CONST::pi" (?pi@CONST@@3NA) already defined in CONSTANTS.obj
> e2.obj : error LNK2005: "double CONST::pi" (?pi@CONST@@3NA) already defined in CONSTANTS.obj
> e3.obj : error LNK2005: "double CONST::pi" (?pi@CONST@@3NA) already defined in CONSTANTS.obj
Это звучит как объявление в mainHeader.h - это проблема, но если я изменю его или вытащу, я получу:
> ...\e3.cpp(34): error C2039: 'pi': is not a member of 'CONST'
> ...\mainHeader.h(12): note: see declaration of 'CONST'
> ...\e3.cpp(34): error C2065: 'pi': undeclared identifier
Так что я не понимаю. Если я достану его, он не найдет никакого определения, если я добавлю его, он найдет более одного.
Код для e1.cpp на всякий случай, хотя я думаю, что единственной проблемой будет первая строка:
#include "mainHeader.h"
namespace E1 {
int main()
{
int ans = 0;
for (int i = 0; i < 1000; i++) {
if ((i % 3 == 0) || (i % 5 == 0)) ans += i;
}
std::cout << ans << std::endl;
return 0;
}
}
Я попробовал то, что я думаю, это каждая комбинация определения и инициализации Я использовал. Я попытался добавить #pragma один раз в CONSTANTS.cpp, в e1.cpp, я даже пытался использовать
#ifndef CONST_H ... #endif
Я добавил # include "mainHeader.h" в каждый файл eX.cpp, потому что есть функции, которыми я хочу поделиться между ними. Как, например, primes.cpp будет иметь некоторые функции, которые будут использовать некоторые файлы eX.cpp, поэтому я должен иметь возможность вызывать их.
Любая помощь будет оценена