[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。
質問
コードは次のとおりです。
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
を使用して、名前付き集約イニシャライザを作成します。
関連
-
[解決済み】C++ -- ' の前に一次式があることが予想される。
-
[解決済み】ValueError: shape mismatch: オブジェクトを1つの形状にブロードキャストできない
-
[解決済み】GAEで完全に有効なXMLをパースすると「Prologではコンテンツが許可されません」と表示される
-
[解決済み】 lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) でエラー : 'y' に NA/NaN/Inf, あらゆる方法を試したが解決しなかった。
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み】 c++ "Incomplete type not allowed" クラス参照情報へのアクセスエラー (前方宣言による円環状依存性)
-
[解決済み】ファイルにデータを書き込むときにこのエラーが発生する理由
-
[解決済み】必要な形式パラメータに対応する引数が与えられない - .NETエラー
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】二重の空きや破損(fasttop)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
git eclipseプラグインのインストール
-
Swift言語とAppleScriptの違い、AppleScriptの開発状況について教えてください。
-
InstallShield で IIS がインストールされているかどうかを検出するスクリプト
-
InstallShield でホスト名から IP アドレスを取得するコード
-
[解決済み] 式は変更可能なlvalueでなければならない
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み】C++ Cout & Cin & System "Ambiguous" [クローズド]。
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み】エラー。式はintegralまたはunscoped enum型でなければなりません。
-
[解決済み】AdMobにアプリケーションを入れたら「ライブラリが見つからない」というエラーが出た