web-dev-qa-db-fra.com

Comment assigner une structure C en ligne?

typedef struct {
    int hour;
    int min;
    int sec;
} counter_t;

Et dans le code, je voudrais initialiser les instances de cette structure sans initialiser explicitement chaque variable membre. Autrement dit, je voudrais faire quelque chose comme:

counter_t counter;
counter = {10,30,47}; //doesn't work

pour 10:30:47

plutôt que

counter.hour = 10;
counter.min = 30;
counter.sec = 47;

Ne me souviens pas de la syntaxe pour cela, et n'a pas trouvé immédiatement un moyen de le faire à partir de Google.

Merci!

39
mindthief

Initialisation:

counter_t c = {10, 30, 47};

Affectation:

c = (counter_t){10, 30, 48};

Ce dernier est appelé "littéral composé".

77
Steve Jessop

Par souci de maintenabilité, je préfère la syntaxe de liste AVEC les variables explicitement identifiées, comme suit:

counter_t counter = {.hour = 10, .min = 30, .sec = 47};

ou pour retourner en ligne par exemple:

return (struct counter_t){.hour = 10, .min = 30, .sec = 47};

Je peux imaginer un scénario où l'on change l'ordre dans lequel les variables sont déclarées, et si vous n'identifiez pas explicitement vos variables, vous devrez parcourir tout le code pour fixer l'ordre des variables. De cette façon, il est plus propre et plus lisible, je pense

Note latérale :

Comme le disent @AshleyDuncan et @ M.M, cette fonctionnalité a été supprimée d'ISO C++ après C99 https://stackoverflow.com/a/12122261/2770195 , mais est prise en charge dans gnu c ++.

Donc, bien que vous puissiez le faire très bien:

g++ -std=gnu++11 main.cpp -o main

Cela générera une erreur si vous essayez l'exemple ci-dessus:

# need an example. I was unable to find. Even clang++ supports it. If you know 
# one, please suggest an edit

Si vous devez compiler avec un compilateur C++ prenant en charge ISO C++ 11 ou une version ultérieure qui ne reconnaît pas cette extension GNU, vous devrez peut-être utiliser une classe avec un constructeur simple:

// backup workaround
// not cool
class gnuFTW {
public:
    int hour;
    int min;
    int sec;
    gnuFTW(int hour, int min, int sec) {
        this->hour = hour;
        this->min = min;
        this->sec = sec;
    }   
};

int main(int argc, const char * argv[]) {
    gnuFTW counter = gnuFTW(10,30,47);
    cout << counter.hour << endl;
    return 0;
}
18
MuhsinFatih