Initialisation d'une structure globale atomique

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdatomic.h>

typedef struct F
{
        int a;
        int b;
} F;

_Atomic F g = ATOMIC_VAR_INIT({0, 0});

int main(void)
{
}

La compilation de ce programme échoue, avec le message suivant pour Clang.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
9:35: error: too many arguments provided to function-like macro invocation
_Atomic F g = ATOMIC_VAR_INIT({0, 0});
                                  ^
/usr/bin/../lib/clang/3.8.1/include/stdatomic.h:56:9: note: macro
      'ATOMIC_VAR_INIT' defined here
#define ATOMIC_VAR_INIT(value) (value)
        ^
9:15: note: cannot use initializer list at the beginning of a macro
      argument
_Atomic F g = ATOMIC_VAR_INIT({0, 0});
              ^               ~~~~~~~
9:15: error: use of undeclared identifier 'ATOMIC_VAR_INIT'
_Atomic F g = ATOMIC_VAR_INIT({0, 0});
              ^

Quelqu'un aurait un moyen pour initialiser ce genre de machins ?

Édité par Praetonus

Mon Github | Mantra : Un Entity-System en C++

+1 -0
Staff

Salut,

Je ne me suis pas intéressé jusqu'à présent aux ajouts de la norme C11 concernant les objets atomiques, mais pour ce qui est de l'erreur, cela vient du fait que tu emploies une macrofonction. Le préprocesseur considérant les arguments des macrofonctions comme des suites de caractères séparés par des virgules, tu as ici deux arguments : {0 et 0}.

Il est possible d'éviter ce problème en recourant à des parenthèses, mais je peux déjà te dire que cela ne fonctionnera pas non plus parce qu'une syntaxe du type struct _s _a = ({ 0, 0 }) est interdite.

Du coup, je pense que tu devras recourir à la fonction atomic_init().

+0 -0
Auteur du sujet

cela vient du fait que tu emploies une macrofonction. Le préprocesseur considérant les arguments des macrofonctions comme des suites de caractères séparés par des virgules, tu as ici deux arguments : {0 et 0}.

Il est possible d'éviter ce problème en recourant à des parenthèses, mais je peux déjà te dire que cela ne fonctionnera pas non plus parce qu'une syntaxe du type struct _s _a = ({ 0, 0 }) est interdite.

Du coup, je pense que tu devras recourir à la fonction atomic_init().

Taurre

Effectivement, il va falloir que je me rabatte là dessus (ou alors je peux peut-être me débrouiller avec la zero-initialization. À voir).

Du coup, je me demande si ça ne pourrait pas être considéré comme un bug de GCC et Clang. Le standard dit ceci sur ATOMIC_VAR_INIT.

The ATOMIC_VAR_INIT macro expands to a token sequence suitable for initializing an atomic object of a type that is initialization-compatible with value.

Et si l'on reprend mon exemple, le type F est initialization-compatible avec {0, 0}. Bref, j'irai faire un tour sur les mailing list respectives.

_Atomic ne peut pas être utilisé sur une structure, mais seulement un type natif (int, double, etc.) :

Accessing a member of an atomic struct/union is undefined behavior.

germinolegrand

Si si, c'est autorisé, d'ailleurs ta citation dit exactement ça puisqu'elle parle d'une action invalide sur les types complexes atomiques, en l'occurrence que s.m est invalide si s est atomique. Autrement dit, toutes les opérations sur une structure atomique doivent s'effectuer sur la structure entière.

Mon Github | Mantra : Un Entity-System en C++

+0 -0

Du coup, je me demande si ça ne pourrait pas être considéré comme un bug de GCC et Clang. Le standard dit ceci sur ATOMIC_VAR_INIT.

The ATOMIC_VAR_INIT macro expands to a token sequence suitable for initializing an atomic object of a type that is initialization-compatible with value.

Et si l'on reprend mon exemple, le type F est initialization-compatible avec {0, 0}. Bref, j'irai faire un tour sur les mailing list respectives.

Praetonus

Apparemment, le comportement actuel est conforme au standard.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte