1

私は次の行を持っています(問題を最小限に示すために縮小されています):

char version_text[64U] = {'\0'};

この行は、次のMISRAエラーを生成します。

Error[Pm023]: missing elements - braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures (MISRA C 2004 rule 9.2).

なぜこれがエラーなのですか?

私の現在の回避策は次のとおりです。

char version_text[64U] = {0};

これは、型が私のコンパイラ(IAR EW)によってchar実装されていることを示しています。signed char

私の理解では、「\ 0」は文字リテラルであるため、タイプと一致する必要がありcharます。

4

3 に答える 3

1

Cでは、整数文字定数のタイプintは、ではなく、charです。それで

char version_text[64U] = { '\0' };

char version_text[64U] = { 0 };

完全に同等です(これはの符号とは無関係ですchar)。int両方とも、唯一のイニシャライザーとして定数を提供します。

MISRAチェッカーが最初のことについて不平を言っているが、2番目のことについては不平を言っているのは、単なる矛盾です。

ただし、これはおそらく、ゼロ初期化が通常1つだけを提供することによって行われる0のに対し、整数文字定数の使用は通常、ゼロ以外の初期化に対してのみ行われるという事実によるものです-MISRAは、メッセージを解釈すると、すべての要素の初期化子を期待します正しく、チェッカーは文字定数の内部を調べません。

于 2013-01-19T00:09:10.010 に答える
1

ルールは言う:

「配列または構造体のすべての要素は、最初の要素に対してのみ明示的な初期化子を指定することで初期化(ゼロまたはNULL)できることにも注意してください。この初期化方法を選択する場合は、最初の要素をゼロ(またはNULL)に初期化する必要があります。 )、ネストされた中括弧を使用する必要はありません。」

これによると、とのみ{0}{NULL}MISRAに準拠しており、{'\ 0'}は準拠していません(コンパイラが同じように処理しますが)。

于 2013-01-19T00:15:16.517 に答える
0

次のことを試してください。

char version_text[64U] = { '\0', };

これは基本的に、各配列要素をNULL最初の要素だけでなく初期化します。カンマに注意してください!

于 2013-02-14T11:02:16.703 に答える