用戶: 密碼:     忘記密碼 | 會員註冊
  

如何在C++Builder中使用全局變量

8.3
出處:2345軟件大全 時間:2011-06-27 人氣:1219

核心提示:如果我在一個公用的頭文件中定義一個變量,在其它單元中可以直接使用它嗎

  如何在C++Builder中使用全局變量?
(1)。如果我在一個公用的頭文件中定義一個變量,在其它單元中可以直接使用它嗎?如下:
//--------------------------------Globals.h----------------------------------
#ifndef GlobalsH
#define GlobalsH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
AnsiString UserName;
//---------------------------------------------------------------------------
#endif

  答案是:或許可以吧。你得到的結果是:只要你引用了這個頭文件N次,那麼就會得到N+1次編譯器警告,選擇你這個變量重複定義,在你引用這個變量的單元中,確實可以使用這個變量,但是在一個單元中對它賦值,在另一個單元中確得不麼,也就是說,它根本就不是全局的,編譯器的處理方法是,在每個單元中重新以這個名稱聲明了一個變量而已。
(2)。如果我在工程文件。cpp中聲明一個變量,在其它單元中可以直接使用它嗎?如下:

//--------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------
USEFORM("TMainForm.cpp", MainForm);
//---------------------------------------------------------------------
AnsiString UserName;
//---------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
}
catch ... //這裡省略了一部分
return 0;
}
//--------------------------------------------------------------------- 
答案是:不可以。但是這確實是定義全局變量的正確方法之一。在工程文件。cpp中聲明了變量,如果想在其它單元中使用它,必須使用extern關鍵字,來聲明這個變量是外部的,所以,在需要使用這個全局變量的單元中,使用extern AnsiString FileName就可以引用一例中的全局變量了。
(3)。在VCL架構的程序中,我們經常用到一些全局變量,你有沒有意識到呢?Application、Screen、IsConsole、IsLibray……等都是應用程序級的全局變量,如果想瞭解更多,請參照VCL手冊的application-level information有關的章節。那麼,這些全局變量是如何定義的呢?
我們揭開VCL的迷霧,直接去查看VCL的代碼(C++Builder中無法直接看到。pas的源代碼,但是編譯器為每個。pas文件生成了一個。hpp的頭文件引用,看看其中的變量和函數聲明即可):在程序空白處輸入Application,按住Ctrl鍵,再點擊它,我們就找到了Application變量的原始定義,如下:

//-- var, const, procedure -------------------------------------------------
extern PACKAGE TApplication* Application; //請看這裡
extern PACKAGE TScreen* Screen;
extern PACKAGE void *Ctl3DBtnWndProc;

  原來VCL擴展了extern關鍵字,在。h或。hpp頭文件用extern PACKAGE來輸出本來在。cpp和。pas單元中定義的變量,使之成為全局變量,因此,我們得到了第三種聲明全局變量的方法:使用extern PACKAGE關鍵字,如下,輸出一個全局變量:

//-----------------------------Globals.cpp----------------------------------
#pragma hdrstop
#include "Globals.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------
AnsiString UserName = "YinJiajun";
//---------------------------------------------------------------------
//-----------------------------Globals.h-------------------------------
#ifndef GlobalsH
#define GlobalsH
//---------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------
extern PACKAGE AnsiString UserName;
//---------------------------------------------------------------------
#endif

  後記:大蝦們都告訴我們,不要使用太多的全局變量,不要使用goto……於是,當你寫程序時,總是有這樣的聲明在我們腦中迴響:“不要使用太多的全局變量,不要使用goto……”。為什麼不要使用這些東西?因為難以駕馭。如果你已劍氣合一,是否還有這樣的顧慮?
刀可以用來切菜,也可以用來殺人,不能因為刀能殺人而禁止用刀。
如果使用全局變量能讓你的程序簡潔明瞭、可讀性好,為什麼不用?
為什麼這些現代程序設計語言仍然要支持goto和全局變量?