1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。

2022-01-10 08:45:36

質問

コードは次のとおりです。

typedef struct foo_t {
    int a, b, c;
} foo_t;

const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;

int main()
{
    return 0;
}

6行目でエラーになります。

Error "initializer element is not constant"

これは、私が取り組んでいる大規模な複数ファイルのプロジェクトの簡略版であることに留意してください。目標は、オブジェクトファイル内に定数を1つ持ち、複数のファイルがそれを使ってステート構造を初期化できるようにすることでした。これはリソースが限られた組み込みターゲットで、構造体はそれほど小さくないので、ソースの複数のコピーは必要ありません。使わない方がいいと思います。

#define foo_init { 1, 2, 3 }

また、ポータブルなコードを書きたいので、C89またはC99が有効なソリューションが必要です。

これはオブジェクトファイル内のORGと関係があるのでしょうか?初期化された変数が1つのORGに入り、2番目のORGの内容をコピーして初期化されるということですか?

戦術を変えて、起動時に初期化関数で全てのコピーを行うようにすればいいのかもしれませんね。他にアイデアがあれば教えてください。

解決方法は?

C言語では、静的な保存期間を持つオブジェクトを初期化するには 定数式 または、定数式を含む集合イニシャライザを使用します。

C言語では、たとえオブジェクトが const .

また、C言語では、quot;constant" という用語があります。 リテラル定数 (例えば 1 , 'a' , 0xFF など)、enumのメンバー、および、以下のような演算子の結果です。 sizeof . Constで修飾されたオブジェクトは、(任意の型の) 定数ではない C言語用語でいうところの これらは、その型に関係なく、静的な保存期間を持つオブジェクトのイニシャライザでは使用できません。

例えば、これは NOT 定数

const int N = 5; /* `N` is not a constant in C */

上記の N はC++では定数ですが、C言語では定数ではありません。

static int j = N; /* ERROR */

静的オブジェクトを非定数で初期化しようとしています。

このため、C言語では圧倒的に #define を使用して名前付き定数を宣言し、さらに #define を使用して、名前付き集約イニシャライザを作成します。