簡體   English   中英

.h中的聲明 .cpp中的定義。 正確?

[英]Declaration in .h. Definition in .cpp. Correct?

太不可思議了 30多年來,我一直在編程,但似乎忘記了如何處理全局變量。 (這是因為我猜我從來沒有真正使用過它們。)在頭文件中,我有-

// any.h
bool neat;

並在cpp中-

// any.cpp
#include <any.h>
bool neat = false;

它告訴我我正在重新定義。 所以我拿出“布爾”-

// any.cpp
#include <any.h>
neat = false;

現在它告訴我“ 錯誤:'整潔'沒有命名類型 '怎么不知道'整潔'是布爾型? 它是同一個翻譯單元,所以我不需要extern 我沒有聲明任何靜態的,所以我知道文件范圍沒有限制。 這應該是一個全局變量。

我對聲明和定義之間的區別的理解是,通過“聲明”,您只是在通知編譯器名稱是某種類型。 而通過“定義”,編譯器實際上會在可執行文件中留出一些空間來保留該名稱。

我究竟做錯了什么?

您需要在頭文件中使用extern關鍵字(並將bool保留在.c文件中)

// any.h
extern bool neat;

// any.cpp
#include <any.h>
bool neat = false;

這樣做的原因是讓鏈接器知道在任何對象的任何地方都存在該名稱的變量,而不是使用該變量在每個對象中為其保留內存。 但是,在實際定義變量的對象中,您必須像對非導出變量所做的那樣對其進行定義。

注意bool neat; (and bool neat = false; )是一個定義 這意味着,如果將它們同時放在頭文件和實現文件中,則會得到多個定義錯誤。

您可以使用extern更改它的聲明,

此外,使用extern並且沒有初始化程序的變量聲明不是定義。

例如,您可以在頭文件中將它們聲明為

extern bool neat; // declaratioin

並在實現文件中將它們定義為

bool neat;        // definition
                  // or bool neat = false; same effect here

關於第二個代碼段的錯誤,請注意neat = false; 不是聲明,也不是定義; 這是一個聲明(賦值),必須放在函數中。 例如

// any.h
bool neat; // definition

// any.cpp
#include <any.h>
void init_neat() { 
    neat = false;
}
int main() {
    init_neat();
    // use neat ...
}

在評論中,您說:

您是指類(或名稱空間)中的函數嗎? 還是您指的是全局功能? 如果是這樣,那么最好有兩個全局名稱(setNeat和getNeat)而不是一個(完整)?

該函數是在名稱空間中還是全局函數的作用並不重要。 IMO,與通過全局變量訪問相比,通過函數提供對數據的訪問要好。

在功能的實現中,您有各種選擇。

  1. 您可以使用變量來維護狀態。
  2. 您可以將函數調用傳遞給其實現保持狀態的另一個函數。
  3. 您可以使用聚合對象(如struct )來維護應用程序的許多其他全局狀態。

當您通過函數提供對數據的訪問權限時,您可以選擇更改數據的維護方式和位置。

暫無
暫無

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

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