none
LPCSTRを返す関数 RRS feed

  • 質問

  • 次のような文字列を返す関数の作り方はダメでしょうか?

    あるいは"未定義"といわれる行為にあたるのでしょうか?

    //①
    char	g_path[MAX_PATH];
    LPCSTR	getPath(){
    	return g_path;
    }

    g_path(グローバル変数)にはプログラムの開始時にファイルから取得した値を格納します。
    他のプログラムはファイルから値を取得せず、getPath関数を通じてg_pathの値を取得します。

    通常なら次のような作り方をすることが多いかと思います。

    //②
    LPSTR	getPath(LPSTR	cPath){
    	return lstrcpy(cPath, g_path);
    }

    しかし、②の方法ではgetPath関数を使う側がいつもメモリを準備しなくてはならず
    固定の文字列として扱いたいだけなのに毎回メモリを確保するのはなんかちょっと面倒と思いました。

    そこでConst利用に限定されてしまいますが
    ①のようにg_pathへのアドレスを直接返す関数も準備しました。

    論理的には問題ないような気はするのですが
    Webで検索してもConst文字列を返すような関数を解説しているサイトはあまり見当たらず
    本当に問題がないかどうか不安になって質問させていただきました。

    以上、よろしくお願い致します。




    2013年9月9日 4:20

回答

  • 考え方次第では?

    ①の場合、グローバル変数を使用しますので、
    グローバル変数特有の問題からは逃れられません。
     ・どこで値が書き換わるか予測できない
        → 排他処理が必要になることも

    そのあたりが問題にならないなら、少なくとも問題は起きないでしょう。

    ただ、
    > 固定の文字列として扱いたいだけ
    ならば、

    LPCSTR g_path = "C:\\Test\\Test.txt"

    の方が簡単で分かりやすい気もしますが(^^;)

    • 回答の候補に設定 星 睦美 2013年9月17日 1:37
    • 回答としてマーク 星 睦美 2013年9月19日 0:32
    2013年9月9日 4:49
  • 特に問題はありませんが、C++言語であれば
    クラス化したほうが使いやすいかもしれません。
    軽く誤用防止をつけるとすると・・・

    class DATA_PATH
    {
       friend  class MyApp; // MyAppからのみ設定可能
       private: static char st_Path[MAX_PATH];
       private: static void SetPathStr( LPCSTR ex_Str){
          strcpy_s( st_Path, MAX_PATH, ex_Str);
       }
       public: static LPCSTR GetPathStr(){ return st_Path;}//取得は誰でもOK
    };
    ----DATA_PATH.cpp----
    char DATA_PATH::st_Path[MAX_PATH];//実体が必要

    ----MyApp.cpp-----
    MyApp::InitInstance(){
       DATA_PATH::SetPathStr( "・・・・");//初期設定
    }
    ----BooDlg.cpp-----
    #include "DATA_PATH.h"
    BooDlg::Foo()
    {
        //クラスヘッダーのインクルードだけで使用可
       SetWindowTextA( hWndStatic, DATA_PATH::GetPathStr());//とか
    }

    2013年9月9日 5:11

すべての返信

  • 考え方次第では?

    ①の場合、グローバル変数を使用しますので、
    グローバル変数特有の問題からは逃れられません。
     ・どこで値が書き換わるか予測できない
        → 排他処理が必要になることも

    そのあたりが問題にならないなら、少なくとも問題は起きないでしょう。

    ただ、
    > 固定の文字列として扱いたいだけ
    ならば、

    LPCSTR g_path = "C:\\Test\\Test.txt"

    の方が簡単で分かりやすい気もしますが(^^;)

    • 回答の候補に設定 星 睦美 2013年9月17日 1:37
    • 回答としてマーク 星 睦美 2013年9月19日 0:32
    2013年9月9日 4:49
  • 特に問題はありませんが、C++言語であれば
    クラス化したほうが使いやすいかもしれません。
    軽く誤用防止をつけるとすると・・・

    class DATA_PATH
    {
       friend  class MyApp; // MyAppからのみ設定可能
       private: static char st_Path[MAX_PATH];
       private: static void SetPathStr( LPCSTR ex_Str){
          strcpy_s( st_Path, MAX_PATH, ex_Str);
       }
       public: static LPCSTR GetPathStr(){ return st_Path;}//取得は誰でもOK
    };
    ----DATA_PATH.cpp----
    char DATA_PATH::st_Path[MAX_PATH];//実体が必要

    ----MyApp.cpp-----
    MyApp::InitInstance(){
       DATA_PATH::SetPathStr( "・・・・");//初期設定
    }
    ----BooDlg.cpp-----
    #include "DATA_PATH.h"
    BooDlg::Foo()
    {
        //クラスヘッダーのインクルードだけで使用可
       SetWindowTextA( hWndStatic, DATA_PATH::GetPathStr());//とか
    }

    2013年9月9日 5:11
  • にーもにっく さん、こんにちは
    フォーラム オペレーターの星 睦美です。

    引き続き質問がないようですので、フォーラムの回答者からの返信が参考になったのではないかと思います。
    私のほうで[回答としてマーク] させていただきました。

    これからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年9月19日 0:34