2013-08-10 8 views
8

する「静的のconst char型*のポーラ」の割り当てループ私は繰り返し関数を呼び出します。この関数には、ユーザの入力に応じて上記の文字列を指すポインタが含まれています。私はそれがSTRING_Aに設定したいデフォルトでは、そう私は、本質的に持っていることはこれです:C:メインプログラムに続いて</p> <pre><code>static const char * const STRING_A = "STRING A"; static const char * const STRING_B = "STRING B"; </code></pre> <p>:私はこのようなファイルの先頭で定義されたいくつかのグローバル文字列を含むプログラムを持っている「静的のconstのchar *」

​​

私が持っている問題は、コンパイル時に私が得るということです「エラー:初期化子要素が定数ではありません」。これはGCC 4.7.2を使用しています。私が混乱しているのは、入力関数の "static"キーワードを取り除くと、エラーがなくなるということです。しかし、これは解決策ではありません。静的キーワードは、関数がコール間の現在の文字列を追跡するために必要です。

明らかに、いくつかのconst修飾子を取り除くだけで、多くの点でこれを修正できます。しかし、なぜこれが機能していないのか理解したい。

グローバルな文字列変数を異なる文字列を指すように変更することはできず、個々の文字を変更することもできません。 staticキーワードは、ソースファイルに対してローカルになります。

私の関数内の変数currentについては、staticキーワードを使用すると関数の複数の呼び出しで値が保持され、この場合のconst修飾子はcurrentが指す文字列が変更可能であることを意味します。それが指す文字列の文字ではありません。

私はこれらのステートメントに矛盾がないので、なぜコンパイラがエラーを出すのか理解できません。特に、currentの "静的"指定子が削除された場合に問題がない理由を理解できません。

誰かが問題の原因を説明できる場合は、ありがとうございます。

答えて

7

6.7.8/4 [C99]:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

STRING_Aは、したがって、どちらもエラーではありません。これを回避するための方法に

一つは、次の行に沿って次のようになります。

void input_function() 
{ 
    static const char *current = NULL; 
    if (current == NULL) { 
     current = STRING_A; 
    } 

    ... 
} 
+0

を。 –

3

STRING_Aは、コンパイル時定数ではありませんので、それはです。あなたの解釈は正しいですが、定数を非定数値(例えばSTRING_A)に初期化することはできません。

STRING_Aはコンパイル時にどのように指摘されていますか? - STRING_Aは、文字列リテラルがメモリ内のどこにあるかに依存して、プログラムの各実行時にメモリの読み取り専用セクション内の異なるアドレスを指します。

あなたは同じ効果に関するながら、この拘束を回避するために次の操作を行う必要があります:私はまだそれのまわりで私の頭をラップするが、高速に答えてくれてありがとうよ

// Defines current to be a null pointer. 
static const char *current = NULL; 

// Determine if current is a null pointer. 
if (current == NULL) current = STRING_A; 
+0

素早く答えてくれてありがとう、彼は何とか速くなったので、私はNPEにそれを渡さなければなりませんでした。再度、感謝します。 –

関連する問題