次のプログラムの 6 行目 (my_foo を foo_init に初期化) でエラーが発生しますが、その理由がよくわかりません。
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;
}
これは、私が取り組んでいる、より大規模な複数ファイル プロジェクトの簡略版であることに注意してください。目標は、オブジェクト ファイルに 1 つの定数を持たせ、複数のファイルで状態構造を初期化できるようにすることです。これはリソースが限られた埋め込みターゲットであり、構造体はそれほど小さくないため、ソースの複数のコピーは不要です。次のものは使用しないことをお勧めします。
#define foo_init { 1, 2, 3 }
また、移植可能なコードを記述しようとしているため、有効な C89 または C99 のソリューションが必要です。
これはオブジェクト ファイル内の ORG と関係があるのでしょうか? 初期化された変数は 1 つの ORG に入り、2 番目の ORG の内容をコピーすることによって初期化されるのでしょうか?
おそらく、戦略を変えて、起動時に初期化関数ですべてのコピーを実行する必要があるでしょう。他にアイデアがない限りは?
ベストアンサー1
C 言語では、静的記憶期間を持つオブジェクトは、定数式、または定数式を含む集合初期化子を使用して初期化する必要があります。
「大きな」オブジェクトは、たとえオブジェクトが として宣言されていたとしても、C では定数式にはなりませんconst
。
さらに、C 言語では、「定数」という用語は、リテラル定数( 1
、'a'
など0xFF
)、列挙型メンバー、および などの演算子の結果を指しますsizeof
。const 修飾オブジェクト (任意の型) は、 C 言語用語では定数ではありません。それらは、その型に関係なく、静的ストレージ期間を持つオブジェクトの初期化子では使用できません。
例えば、これは定数ではない
const int N = 5; /* `N` is not a constant in C */
上記はN
C++では定数ですが、Cでは定数ではありません。したがって、次のようにすると
static int j = N; /* ERROR */
同じエラーが発生します。つまり、静的オブジェクトを非定数で初期化しようとしたということです。
#define
これが、C 言語では主に名前付き定数を宣言するために を使用し、#define
名前付き集合体初期化子を作成するために を使用する理由です。