Question

Est-il une raison particulière pourquoi soutien pour les initialiseurs pas été ajouté à g++?C'est la raison que C99 normes est arrivé en retard et g++ a été développé plus tôt et plus tard les gens ne se soucient pas de ce problème, ou s'il existe quelque difficulté inhérente à la mise en œuvre désigné initialiseurs dans la grammaire du C++?

Était-ce utile?

La solution

Comme je l'ai noté dans un commentaire, G ++ ne prend pas en charge les initialiseurs désignés au standard C99, mais il supporte l'extension GNU vers C90 qui autorise les initialiseurs désignés.Donc cela ne fonctionne pas:

union value_t {
    char * v_cp;
    float v_f;
};
union value_t my_val = { .v_f = 3.5f };

Mais c'est le cas:

union value_t my_val = { v_f: 3.5f };

Cela semble être une mauvaise interaction de coordination entre les comités de normalisation C et C ++ (il n'y a pas de raison particulièrement bonne pour que C ++ ne supporte pas la syntaxe C99, ils ne l'ont tout simplement pas envisagée) et la politique GCC (C ++ ne devrait pas prendre en charge la syntaxe C99 simplement parce qu'elle est en C99, mais il devrait prendre en charge la syntaxe d'extension GNU qui réalise exactement la même chose car c'est une extension GNU qui peut être appliquée à l'un ou l'autre langage).

Autres conseils

J'ai rencontré le même problème aujourd'hui.g ++ avec -std= c ++ 11 et c ++ 14 prend en charge les initialiseurs désignés, mais vous pouvez toujours obtenir une erreur de compilation "test.cxx: 78: 9: désolé, non implémenté: initialiseurs désignés non triviaux non pris en charge" si vousn'initialisez pas la structure dans l'ordre dans lequel ses membres ont été définis.À titre d'exemple

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 ++ ne prend pas en charge cela.Ce ne sera même pas dans les normes C ++ 0x il semble: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1

Aussi, pourquoi essayez-vous de compiler le noyau Linux avec G ++?

A partir d'au moins G ++ - 4.8 Ceci est maintenant pris en charge par défaut.

Il sera officiellement pris en charge en C++20, et est déjà mis en œuvre dans g++8.2 (même sans le std=c++2a drapeau).

What about anonymous unions?

In C I can have this:

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;
    };
};

And initialized like this:

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) }
    };

However under g++ even with c++14 this gives the same "sorry, unimplemented" error. We do need to be able to define C variables in C++ when we at least want to unit test C code with C++ test framework. The fact that such a valuable feature from C is not being supported is quite a shame.

Accoding to http://gcc.gnu.org/c99status.html designated initializers have been already implemented.

What version of g++ do you use? (Try g++ -- version)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top