簡體   English   中英

C++ 在命名空間中引用 extern const

[英]C++ Referencing extern const within a namespace

我試圖在我的項目的其他地方使用在 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

主程序

#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 函數和命名空間的類似解釋,但大多數建議首先反對這樣做,而是提供另一種解決方案。 我,不幸的是不能使用它們。 人們遇到的其他錯誤是獲得了我沒有的“多重裝飾”。

編輯

有關更詳細的信息,請參閱下面的 Brians 解釋。

我需要做的是定義

const int SIZE = 4;

在命名空間 TAXCONSTANTS 中的 TaxConstants.hpp 文件中。

然后刪除'extern const int SIZE;' 從我的主文件中,而是通過 TAXCONSTANTS::SIZE 在我想使用大小的任何地方引用 SIZE。

這是我完全忘記的基本命名空間內容。

如果您在沒有extern關鍵字的情況下定義SIZE ,它將具有內部鏈接,因為它是const 您可以在main.cpp TAXCONSTANTS::SIZE其稱為TAXCONSTANTS::SIZE 這是推薦的,因為編譯器將能夠在任何使用SIZE地方內聯該值。

如果您使用extern關鍵字定義SIZE ,它將具有外部鏈接,並且不應在標題中,除非您想要多個定義錯誤。 您應該改為在.cpp文件中定義它,該文件將鏈接到程序的其余部分。 在這種情況下,整個程序中將只有SIZE一個副本。 您應該避免這種方法(更喜歡沒有extern的方法),除非由於某種原因您實際上只需要在整個程序中只有一個SIZE副本。

在這兩種情況下, SIZE都是TAXCONSTANTS命名空間的成員。

您嘗試在main中重新聲明SIZE並沒有按照您的想法行事! 以下main

extern const int SIZE;

實際上具有在全局命名空間中聲明SIZE的效果。 由於全局命名空間中沒有SIZE定義,因此在鏈接時會出現未定義的引用錯誤。 引用TAXCONSTANTS定義的SIZE變量不是正確的方法。

整個方法存在多個問題。

  1. 您的

    extern const int SIZE;

    main是來自全局命名空間的const int對象SIZE的聲明 - ::SIZE 這個SIZE與您的TAXCONSTANTS::SIZE完全無關。 此類全局::SIZE對象未在您的程序中定義,這就是您收到“未定義引用”錯誤的原因。

    由於您已經在頭文件中聲明了TAXCONSTANTS::SIZE ,因此您無需在main再次重新聲明SIZE 你為什么做這個?

    只是刪除從申報main和使用SIZETAXCONSTANTS或者通過using namespace TAXCONSTANTS或通過指定限定名TAXCONSTANTS::SIZE

  2. 您在頭文件中的聲明實際上是一個定義 將此頭文件包含在多個翻譯單元中將導致另一個錯誤:具有外部鏈接的同一對象的多個定義。

    如果你想聲明一個全局常量對象,你必須在頭文件中保留一個純粹的非定義聲明

    namespace TAXCONSTANTS { extern const int SIZE; // declaration, not definition }

    並將定義移動到實現文件之一

    namespace TAXCONSTANTS { extern const int SIZE = 4; // definition }
  3. 但是,您似乎打算將此常量用作積分常量表達式(作為數組聲明中的數組大小)。 沒有初始化程序聲明的extern const int常量不適用於該目的。

    忘記extern並在頭文件中聲明一個帶有內部鏈接的普通常量

    namespace TAXCONSTANTS { const int SIZE = 4; // definition with internal linkage }

    然后在任何需要的地方使用

    using namespace TAXCONSTANTS; int main() { taxPayer payers[SIZE]; ... }

    或者

    // no 'using namespace TAXCONSTANTS;' int main() { taxPayer payers[TAXCONSTANTS::SIZE]; ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM