如何修复带有命名空间的标头中常量的重定义错误?
How to fix redefinition error with constants in Header with Namespaces?
我是一个有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文件工作正常。在我创建常量之前,它按需要编译和工作.cpp并决定对常量进行测试
问题是这段代码告诉我CONSTANTS.cpp中的 pi 定义不正确:
缺少类型说明符 - 假定为 int。注意:C++不支持默认整数
但是,如果我将类型添加到常量中的定义中
它抛出重新定义错误。
> 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 文件中,因为我想在它们之间共享一些函数。例如素数.cpp将具有某些 eX.cpp 文件将使用的一些函数,所以我需要能够调用它们。
任何帮助将不胜感激
将 pi 声明为 const double 并在标头中初始化它,或者如果您不想将其声明为 const 真的那么在声明前面加上 extern。如果你不这样做,它仍然是extern,但它也被定义为0。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 在定义的函数中使用常量时出错
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- C++ 确保子类为常量提供自定义值
- 用矩阵将函数中的整数值替换定义的常量
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 将字符串文本常量定义为 char const* 和 wchar const*
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 调用构造函数与将内联常量定义为默认参数
- 是否允许在常量定义的对象上丢弃 const 只要它没有实际被修改?
- 多个文件中的常量定义
- 常量定义和模板
- 如何在另一个命名空间中使用常量定义的外部
- 全局常量定义的顺序
- 将常量定义为函数会导致标头=坏主意
- 是一个宏,其变量总是用变量或常量定义