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

时间:2019-04-29 00:03:08

标签: c++ header namespaces

我是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;
}

当然,有一个主要功能是大部分为空,而其他两个.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文件将使用的某些功能,因此我需要能够对其进行调用。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

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