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

Я новичок в 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, поэтому я должен иметь возможность вызывать их.

Любая помощь будет оценена

1 Ответ

0 голосов
/ 29 апреля 2019

Объявите pi как const double и инициализируйте его в заголовке, или, если вы действительно не хотите объявлять его как const, тогда добавьте extern к объявлению. Если вы этого не сделаете, он будет внешним, но также определен как 0.

...