1

802.15.4 で AES を実装する古いプロジェクトからコードを取得しました。これは、次のようにデフォルト キーを定義します。

static uint8_t default_key_source[8] = {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

その後、次の方法でこれを使用するテーブルを定義します。

uint8_t mac_key_table[34] =
{
    // KeyIdLookupList[1].LookupData : macDefaultKeySource || g_Sec_KeyIndex_1
    default_key_source[0], // LookupData[0]
    default_key_source[1], // LookupData[1]
    default_key_source[2], // LookupData[2]
    default_key_source[3], // LookupData[3]
    default_key_source[4], // LookupData[4]
    default_key_source[5], // LookupData[5]
    default_key_source[6], // LookupData[6]
...
}

コンパイル時に「式には定数値が必要です」というエラーが表示されます。以前は別のコンパイラでコンパイルしていたため、これは奇妙です(正確にはわかりませんが、ARM用のIAR組み込みワークベンチを使用しています)

default_key_source の static 宣言の前に const を追加してみました。しかし、それは役に立ちませんでした。コンパイラは変数で構造体を初期化できないことがわかりましたが、これらの変数は定数なので、ここで何が問題なのですか?

4

2 に答える 2

3

変数に静的ストレージ期間がある場合、Cでは定数初期化子が必要です。あなたの場合、mac_key_table配列はファイルスコープで宣言され、ファイルスコープで宣言されたオブジェクトは静的ストレージ期間を持ちます。

Cでは、オブジェクトの値は定数とは見なされません。constキーワードを追加しようとしましたが、Cでは、オブジェクトを定数constとして修飾せず、読み取り専用として修飾します。

Cの定数式の例は、リテラル、リテラルを含む式、または列挙型メンバーです。

于 2012-09-25T07:48:41.243 に答える
2

Cでこのような状況に対処する簡単な方法は、マクロを使用して、定数を1か所でのみ定義する必要があることを確認することです。

#define DEFAULT_KEY_SOURCE 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

// if you really need that variable
static default_key_source[8] = { DEFAULT_KEY_SOURCE };

uint8_t mac_key_table[34] =
{
  DEFAULT_KEY_SOURCE,
  ...
};
于 2012-09-25T08:06:05.510 に答える