C ++引用命名空间中的extern const

时间:2017-02-07 02:16:00

标签: c++ namespaces const extern

我正在尝试使用在我的项目中其他地方的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到处想要使用大小。

这是我完全忘记的基本命名空间。

2 个答案:

答案 0 :(得分:0)

整个方法存在多个问题。

  1. 您的

    extern const int SIZE;
    
    main中的

    是来自全局命名空间const int的{​​{1}}对象SIZE的声明。此::SIZE与您的SIZE完全无关。这样的全局TAXCONSTANTS::SIZE对象没有在你的程序中定义,这就是为什么你得到&#34;未定义的引用&#34;错误。

    由于您已在头文件中声明了::SIZE,因此您无需在TAXCONSTANTS::SIZE中重新声明SIZE。你为什么这样做?

    只需从main移除声明,然后使用main中的SIZETAXCONSTANTS或指定限定名称using namespace TAXCONSTANTS

    < / LI>
  2. 头文件中的声明实际上是定义。将此头文件包含到多个翻译单元中将导致另一个错误:具有外部链接的同一对象的多个定义。

    如果要声明全局常量对象,则必须在头文件中保留一个非定义声明

    TAXCONSTANTS::SIZE

    并将定义移动到实现文件之一

    namespace TAXCONSTANTS
    {
      extern const int SIZE; // declaration, not definition
    }
    
  3. 但是,您似乎计划将此常量用作积分常量表达式(作为数组声明中的数组大小)。声明没有初始值设定项的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变量的正确方法。