指定された初期剤がG ++で実装されていないのはなぜですか
-
29-10-2019 - |
質問
指定された初期剤のサポートがG ++に追加されていない特定の理由はありますか? C99の標準が遅れており、G ++が以前に開発され、後で人々がこの問題を気にしなかった理由は、C ++の文法に指定された初期化剤を実装することに固有の困難がありますか?
解決
コメントで述べたように、G ++はC99標準指定のイニシャルをサポートしていませんが、指定された初期化物を許可するC90へのGNU拡張をサポートしています。だからこれはうまくいきません:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
しかし、これは次のとおりです。
union value_t my_val = { v_f: 3.5f };
これは、C ++標準委員会とC ++標準委員会の間の調整の悪い相互作用のように思われます(C ++がC99構文をサポートしていないのは特に正当な理由はありません。 C99の構文はC99にあるという理由だけでサポートされていますが、どちらの言語にも適用できるGNU拡張機能であるため、まったく同じことを達成するGNU拡張構文をサポートする必要があります)。
他のヒント
今日も同じ問題に遭遇しました。 -std = c ++ 11およびc ++ 14のG ++は、指定された初期剤をサポートしていますが、コンピレーションエラーを取得できます "test.cxx:78:9:申し訳ありませんが、不明瞭:非些細な指定された初期化剤がサポートされていない場合」メンバーが定義されている順序で構造体を初期化しないでください。例として
struct x
{
int a;
int b;
};
// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};
C ++はこれをサポートしていません。 C ++ 0x標準にさえありません。 http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
また、G ++でLinuxカーネルをコンパイルしようとしているのはなぜですか?
少なくともG ++ -4.8の時点で、これはデフォルトでサポートされています。
そうなる C ++ 20で正式にサポートされています, 、 そして g ++ 8.2に既に実装されています (なくても std=c++2a
国旗)。
匿名の組合はどうですか?
CIではこれを持つことができます:
struct vardir_entry {
const uint16_t id;
const uint8_t sub;
const char *name;
const uint8_t type;
const union {
struct vardir_lookup lookup;
struct vardir_min_max_conf minmax;
};
const union {
const struct vardir_value_target_const const_value;
const struct vardir_value_target value;
};
};
このように初期化:
static const struct vardir_entry _directory[]{
{ .id = 0xefef, .sub = 0, .name = "test", .type = VAR_UINT32, .minmax = { .min = 0, .max = 1000 }, .value = VARDIR_ENTRY_VALUE(struct obj, &obj, member) }
};
ただし、G ++では、C ++ 14を使用しても、これは同じ「ごめんなさい、実装されていない」エラーを与えます。少なくともC ++テストフレームワークを使用してCコードを単位テストしたい場合は、C ++のC変数を定義できる必要があります。 Cからのこのような貴重な機能がサポートされていないという事実は、非常に残念です。
補うhttp://gcc.gnu.org/c99status.html指定された初期剤はすでに実装されています。
どのバージョンのG ++を使用していますか? (G ++を試してください - バージョン)