我是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文件将使用的函数,因此我需要能够调用它们。
任何帮助将不胜感激
将pi声明为const double并在头文件中对其进行初始化,或者如果您不想将其声明为const,则将extern添加到声明中。如果你不这样做它仍然是extern,但它也被定义为0。