指定された初期化子のサポートがg++に追加されなかった特別な理由はありますか?C99標準が遅れて、g ++が早く開発され、後で人々がこの問題を気にしなかった理由、またはC ++の文法に指定された初期化子を実装するのに固有の困難があるのですか?
7 に答える
私は今日、これと同じ問題に遭遇しました。g ++ with -std = c++11およびc++14は指定された初期化子をサポートしますが、コンパイルエラー「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};
コメントで述べたように、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構文をサポートしない理由は特にありません。彼らはそれを考慮していません)とGCC政治(C ++はすべきではありません)の間の調整の悪い相互作用のようです。 t C99にあるという理由だけでC99構文をサポートしますが、どちらの言語にも適用できるGNU拡張であるため、まったく同じことを実現するGNU拡張構文をサポートする必要があります。
C++はこれをサポートしていません。C ++ 0x標準には含まれていないようです: http: //groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli = 1
また、なぜLinuxカーネルをG ++でコンパイルしようとしているのですか?
これはC++20で公式にサポートされており、すでにg ++ 8.2で実装されていますstd=c++2a
(フラグがなくても)。
少なくともg++-4.8以降、これはデフォルトでサポートされるようになりました。
匿名の組合はどうですか?
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 ++-バージョンを試してください)