Initialiser la structure sans affectation?

Je ne pouvais pas trouver de réponse à cela sur Internet, alors voici ma question: Puis-je définir une instance de struct sans l’affecter à une variable locale ou globale en C? Par exemple:

struct A { int b; } struct A foo() { return struct A { .b = 42 }; } 

Si ce n’est pas possible: pourquoi?

    Oui, C99 fournit des littéraux composés pour cela ( voir en direct ):

     return (struct A) { 42 } ; 

    qui est couvert dans le projet de norme C99, section 6.5.2.5 composés et dit:

    Une expression postfixe qui consiste en un nom de type entre parenthèses suivi d’une liste d’accolades joint par une accolade est un littéral composé. Il fournit un object non nommé dont la valeur est donnée par la liste d’initialisation. 84)

    et:

    La valeur du littéral composé est celle d’un object non nommé initialisé par la liste d’initialisation. Si le littéral composé survient en dehors du corps d’une fonction, l’object a une durée de stockage statique. sinon, la durée de stockage automatique est associée au bloc englobant.

    et fournit plusieurs exemples, notamment:

    Exemple 3 Des initialiseurs avec des désignations peuvent être combinés avec des littéraux composés. Les objects de structure créés à l’aide de littéraux composés peuvent être transmis à des fonctions sans dépendre de l’ordre des membres:

     drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4}); 

    gcc aussi un bon document à ce sujet dans sa section extension car il supporte cette fonctionnalité en dehors de C99 ainsi que clang .

    Oui, vous pouvez utiliser des littéraux composés à partir de C99.

     return (struct A) { .b = 42 }; 

    Vous pouvez même leur indiquer:

     struct A *a = &(struct A) { .b = 42 }; a->b = 43; 

    Ces littéraux sont “meilleurs” que les littéraux de chaîne en ce sens qu’ils sont accessibles en écriture. Le compilateur peut les regrouper si et seulement si vous incluez const dans le type du littéral.

    Oui, c’est possible depuis C99. C’est un littéral composé.

    Pourtant, votre syntaxe est la vôtre. Utilisation:

     (struct A){.b=42} 

    ou

     (struct A){42} 

    Cependant, optez pour des littéraux constants si cela n’a pas d’importance:

     (const struct A){.b=42} 

    Tous les littéraux constants sont soumis à un pooling constant (y compris les littéraux chaîne qui ont le type char[] pour des raisons historiques).
    Les littéraux composés constants et les littéraux composés en dehors de toute fonction ont une durée de stockage statique,
    les autres ont une durée de stockage automatique (attention de ne pas retourner un pointeur, ils doivent également être initialisés à chaque fois).

    En résumé, préférez les littéraux constants dans la mesure du possible.