Initialisation d'une structure globale atomique

Le problème exposé dans ce sujet a été résolu.

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 ?

+1 -0

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

Salut, il y a déjà un gros problème à la base, parce que _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.

Voir ici : http://en.cppreference.com/w/c/language/atomic

+0 -0

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.

+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.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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