2016-03-23 13 views
1

私はC++でコンソールプログラムを作成しています。C++ここで/静的テキストを正しく定義する方法

私は最近、すべてのコードがすべて1つのCファイルでなければなりませんでしたCプロジェクトを持っていた"error wrong usage, usage is: program <parameter> <parameter2>""game over!"

のような静的なテキスト行を持っています。私はちょうどこれのような多くの定義を作った:

#define ERRUSAGE "Usage error: correct usage is ./bla - bla2 -etc" 

含めると、機能の事前定義の前に。

私は複数のファイルを持つことが許可されているC++プログラムに取り組んでいます。私は何かを定義するために.hファイルを使用し、何かを実装するために.cppファイルを使用することを学びました。

のでstaticTextOutput.hを作り、ここに行くと

#ifndef BLABLA 
#define BLABLA "sometext" 
#endif 

でそれを埋めるための方法があり、私はそれを必要とする場所、それが含まれていますか?

ここでベストプラクティスは何ですか?

O/

EDIT:のconstを作る代わりの定義を使用してについての私に思い出させるため

おかげ。それは大きなポイントです。

私の疑問を解決するには:ファイル構造がどのように表示されるかを知りたいと思います(.hファイルには伝統的に宣言と.cppファイル定義が含まれています)。

私は構造体(答えとしてXaqqが投稿されたような)が静的/ constメンバーを持っているので、関数とクラスの検索方法を知っていますか?

+0

私はこのようなメッセージのために別の名前空間を作成し、const文字列などを使用する必要があります、それらの配列またはベクトルかもしれないと思います。 – Incomputable

+0

defineの代わりに 'constexpr'を使うことができます。これはC++ 11では優れています。 – Matth

答えて

8

ゲーム内の文字列(ダイアログなど)に対処するための一般的な方法は、彼らはあなたが実行時に一度ロードアセットファイルに保存されていることです:あなたは、このようにそれを使用することができます

struct Messages 
{ 
constexpr static const char * const blabla = "sometext"; 
}; 

変数に格納します。

あなたがタイプミスを修正するために、すべてを再コンパイル、あなたは簡単に複数の言語を扱うことができないよう、この方法では、など

+0

ここでベストプラクティスのアプローチは何ですか?私はそれをどのファイルタイプに入れるべきですか? .hまたは.cppファイル内にありますか? (私がXaqqのような構造体を答えで使用した場合)構造体を名前空間に入れるのではなく、構造体を使う理由は何ですか? – t0b4cc0

+0

あなたの質問についてはわかりません。あなたの文字列をtxtファイルに入れて、実行時に解析することができます。 – Zouch

1

これはC++のタグが付けられているので、可能であればマクロから離れることをおすすめします。

コンパイラでサポートされている場合は、constexprを使用して静的テキストを定義します。

std::cout << Messages::blabla << std::endl; 
+0

'constexpr static const char * const'は' constexpr static const char * 'と同じです – DimChtz

+0

しかし、文字列リテラルをコンパイラで連結できるという大きな利点があります。 'constexpr char *'はできません。 – SergeyA

+0

代わりに文字列を使うことができます – DimChtz

0

私は、以下の文書の先頭でこれを書きますのを含める:

私が使用
const static std::string CErrorMessage = "Usage error: correct usage is ./bla - bla2 -etc"; 
+0

単純な 'static const char * const'がトリックをするとき、' std :: string'のすべての重い重みはなぜですか? – SergeyA

+0

C++では 'std :: string'sが好きです。 Cでは 'char *'が好きです。 – Vinigas

+1

@Vinigas本当に必要なときに 'std :: string'を使います。 @Vinigas、なぜですか? –

1

文字配列:

static const char my_text[] = "Three little froggies, ready to jump."; 

static constは、コンパイラは、読み取り専用セクションにテキストを配置することを可能にすると、インスタンスは1つだけだから、コンプilerは直接(スタックにコピーすることなく)アクセスできます。長さは、コンパイル時に計算するため

配列表記ができます

const unsigned int text_length = sizeof(my_text) - 1U; 

1Uは、NUL終了文字を表します。

関連する問題