如何在C Builder中使用全域變數

來源:互聯網
上載者:User

本文詳細解釋了如何在C Builder中使用全域變數。

作者:yifei(尹加俊)
信箱:yifei1900@163.com

  如何在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就可以引用一例中的全域變數了。
// 本文轉自 C Builder研究 - http://www.ccrun.com/article.asp?i=626&d=wph422
  (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和全域變數?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.