如何使用命名空间标题中的常量修复重定义错误?

问题描述 投票:1回答:1

我是C ++的初学者,我正在尝试使用标题和命名空间。具体来说,我想用自己的命名空间创建不同的模块,这样我就可以使用一个程序来浏览其他程序,而无需混合名称。我使用了这个other question的建议,它可以正常使用函数但是当我得到一个常数时,我得到一个“重新定义的错误”

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之前,它按照需要进行编译和工作,并决定对常量进行相同的测试

问题是这段代码告诉我CONSTANTS.cpp中的pi没有正确定义:

缺少类型说明符 - 假设为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

我在每个eX.cpp文件中添加了#include“mainHeader.h”,因为我想在它们之间共享函数。例如,primes.cpp将具有一些eX.cpp文件将使用的函数,因此我需要能够调用它们。

任何帮助将不胜感激

c++ header namespaces
1个回答
0
投票

将pi声明为const double并在头文件中对其进行初始化,或者如果您不想将其声明为const,则将extern添加到声明中。如果你不这样做它仍然是extern,但它也被定义为0。

© www.soinside.com 2019 - 2024. All rights reserved.