extern(外部変数)を使う

extern(外部変数)を使って、Main.cpp と Sub.cpp で領域を共有します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 領域 int val は Main.cpp で定義されています。
    この領域を Sub.cpp で参照するには、パラメータで渡す方法が一般的なのですが、extern を使って共有することも出来ます。
  2. Main.cpp です。
    int val= 5; が共有する領域です。
    /**************************************/
    /*★ extern Test Program    前田 稔 ★*/
    /**************************************/
    #include    <windows.h>
    
    //Global Area
    int     val= 5;
    //Function Prototype
    void    func();
    
    void    Msg(char *chr, int n)
    {   char    str[80];
        wsprintf(str,"%s=%d\n",chr,n);
        MessageBox(NULL,str,"Debug Message Box",MB_OK);
    }
    
    //★ Windows Main 関数
    int  WINAPI  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        Msg("val の初期値", val);
        func();
        Msg("func を実行後の値", val);
        return 0;
    }
    
  3. Sub.cpp です。
    extern で val; を宣言することにより Main.cpp と val の領域を共有します。
    /***************************************/
    /*★ extern で val を定義    前田 稔 ★*/
    /***************************************/
    //Main.cpp で定義されている変数
    extern  int     val;
    
    // val に値を格納
    void  func()
    {   val= 123;
    }
    

    専用の関数を定義する

  4. Object Class が一般化するに従い、最近では extern は使われなくなって来ました。
    extern を使うよりも、領域にアクセスする専用の関数を定義する方が解り易いのでは無いでしょうか。
    getput.cpp で val の領域を定義して、val を参照する関数 getval() と setval(int v) を定義しています。
    /*****************************************/
    /*★ get, set で val を参照    前田 稔 ★*/
    /*****************************************/
    int     val;
    
    // val の値を取得
    int     getval()
    {   return val;
    }
    
    // val に値を格納
    void    setval(int v)
    {   val = v;
    }
    
  5. getput.cpp のヘッダーファイル getput.h です。
    int     getval();
    void    setval(int v);
    
  6. Main.cpp から setval(), getval() 関数を使って val の領域にアクセスします。
    /**************************************/
    /*★ getset Test Program    前田 稔 ★*/
    /**************************************/
    #include    <windows.h>
    #include    "getset.h"
    
    void    Msg(char *chr, int n)
    {   char    str[80];
        wsprintf(str,"%s=%d\n",chr,n);
        MessageBox(NULL,str,"Debug Message Box",MB_OK);
    }
    
    //★ Windows Main 関数
    int  WINAPI  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {
        setval(123);
        Msg("val の値=", getval());
        return 0;
    }
    
  7. 新しい言語(C#など)では、Object Class の領域にアクセスする専用の機能が用意されています。
    詳細は Set,Get アクセッサ を参照して下さい。

    C++ から C の関数を参照する

  8. C++ から C の関数を参照するときにも extern を使います。
    extern "C" {        /* Assume C declarations for C++ */
            void        AppInit(HWND g_hList);
            void        AppEnd();
    }
    
    具体的な例は List View の設定と Drag & Drop を参照して下さい。

超初心者のプログラム入門(Win32API C++)