我是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文件将使用的某些功能,因此我需要能够对其进行调用。
任何帮助将不胜感激
答案 0 :(得分:0)
将pi声明为const double,并在标头中对其进行初始化,或者如果您实际上不想将其声明为const,则在extern之前添加声明。如果您仍然不这样做,它将仍然是extern,但它也被定义为0。