パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

ゆるぼ:C言語でネストした構造体の初期値定義がしたい」記事へのコメント

  • C言語の場合、静的変数の初期値はコンパイル時に確定する必要があるので、リテラルでないものは初期値には指定できません。
    auto変数の場合は、初期値は実行時に設定されるので、変数でも関数でも指定できます。

    マクロで初期値とする複合リテラルを宣言するのがいちばん素直な方法だと思います。
    マクロであればネストしてもかまいませんし。
    マクロ宣言で行末にバックスラッシュを書くことなどたいした問題ではないし、コード本文で初期値を正しく書けるのであれば、マクロ宣言でも正しく書けるはずです。
    マクロの展開結果が不安なら、cc -E で確認できます。

    どうしてもマクロで書くのが嫌なら、gcc の場合、__attribute__((constructor)) をつけて関数宣言すれば、main の実行の前にこの関数が実行されます。
    グローバル変数であれば、ここで初期化することはできます。
    (関数内 static はスコープ上無理。)

    あるいは、処理系がC++11に対応していれば、constexpr 指定でコンパイラが計算してくれるため、初期値として constexpr 宣言した変数も指定できます。
    ただし、これは C++ としての機能であるため、ファイルの拡張子を .cpp などにして、中身は mangle させないように extern "C" { }; で前後をくくっておくようにしておく必要があります。

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

処理中...