我正在尝试使用在我的项目中其他地方的TaxConstants.hpp名称空间TAXCONSTANTS中声明的常量int SIZE。当我尝试编译时,我得到"未定义的引用' SIZE' SIZE被引用的所有地方。
文件TaxConstants.hpp
#ifndef TaxConstants_hpp
#define TaxConstants_hpp
namespace TAXCONSTANTS
{
extern const int SIZE = 4; // I have tried with and without extern
}
#endif //TAXCONSTANTS_HPP
的main.cpp
#include <iostream>
#include "TaxConstants.hpp"
using namespace std;
using namespace TAXCONSTANTS;
int main()
{
extern const int SIZE;
// This is a struct defined in another file. It is a sample of my use for SIZE. I left out the #include above to simplify things.
taxPayer payers[SIZE];
//More code
return 0;
}
附加信息:这是一个学校项目,我的教学要求在命名空间TAXCONSTANTS中的TaxConstants.hpp文件中声明常量。
总共有5个文件,带有我的函数的文件对SIZE错误具有相同的未定义引用。
我花了几个小时在extern函数和命名空间上查找类似的解释,但大多数建议都反对这样做,首先提供另一个解决方案。不幸的是我无法使用它们。人们遇到的其他错误&#34;多重装饰&#34;我没有。
有关更详细的信息,请参阅下面的Brians说明。
我需要做的是定义
const int SIZE = 4;
在命名空间TAXCONSTANTS中的TaxConstants.hpp文件中。
然后删除 &#39; extern const int SIZE;&#39; 从我的主文件中引用SIZE by TAXCONSTANTS :: SIZE到处想要使用大小。
这是我完全忘记的基本命名空间。
答案 0 :(得分:0)
整个方法存在多个问题。
您的
extern const int SIZE;
main
中的是来自全局命名空间const int
的{{1}}对象SIZE
的声明。此::SIZE
与您的SIZE
完全无关。这样的全局TAXCONSTANTS::SIZE
对象没有在你的程序中定义,这就是为什么你得到&#34;未定义的引用&#34;错误。
由于您已在头文件中声明了::SIZE
,因此您无需在TAXCONSTANTS::SIZE
中重新声明SIZE
。你为什么这样做?
只需从main
移除声明,然后使用main
中的SIZE
或TAXCONSTANTS
或指定限定名称using namespace TAXCONSTANTS
。
头文件中的声明实际上是定义。将此头文件包含到多个翻译单元中将导致另一个错误:具有外部链接的同一对象的多个定义。
如果要声明全局常量对象,则必须在头文件中保留一个非定义声明
TAXCONSTANTS::SIZE
并将定义移动到实现文件之一
namespace TAXCONSTANTS
{
extern const int SIZE; // declaration, not definition
}
但是,您似乎计划将此常量用作积分常量表达式(作为数组声明中的数组大小)。声明没有初始值设定项的namespace TAXCONSTANTS
{
extern const int SIZE = 4; // definition
}
常量不能用于此目的。
忘记extern const int
并在头文件
extern
然后只需在任何需要的地方使用
namespace TAXCONSTANTS
{
const int SIZE = 4; // definition with internal linkage
}
或
using namespace TAXCONSTANTS;
int main()
{
taxPayer payers[SIZE];
...
}
答案 1 :(得分:0)
如果您定义SIZE
而不使用 extern
关键字,则它将具有内部链接,因为它是const
。您可以在main.cpp
中将其称为TAXCONSTANTS::SIZE
。建议这样做,因为编译器能够在使用SIZE
的任何地方内联值。
如果使用<{strong> SIZE
关键字定义extern
,它将具有外部链接,并且不应位于标题中,除非您需要多个定义错误。您应该在.cpp
文件中定义它,该文件将链接到程序的其余部分。在这种情况下,整个程序中只有SIZE
的一个副本。你应该避免使用这种方法(而不是选择没有extern
)的方法,除非由于某种原因你实际上只需要在整个程序中只有SIZE
的一个副本。
在这两种情况下,SIZE
都将成为TAXCONSTANTS
命名空间的成员。
您尝试在SIZE
内重新声明main
并不符合您的想法! main
内的以下内容:
extern const int SIZE;
实际上具有在全局命名空间中声明SIZE
的效果。由于全局命名空间中没有SIZE
的定义,因此在链接时会出现未定义的引用错误。 不是引用SIZE
中定义的TAXCONSTANTS
变量的正确方法。