Bonjour,

je reprend du code (qui compilait il y a 10 ans), et j'ai quelques problèmes avec les macros.

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define addfield_parse_uint(x)\
uint##x##_t addfield_parse_uint##x(char *s){\
    uint##x##_t i;\
    char c;\
    int res; \
    if(s[0] != '0' || s[1] == '\0') \
    	res = sscanf(s,"%"SCNu##x"%c",&i,&c); \
    else if(s[1] == 'x' || s[1] == 'X') \
    	res = sscanf(s + 2,"%"SCNx##x"%c",&i,&c); \
    else \
    	res = sscanf(s + 1,"%"SCNo##x"%c",&i,&c); \
    if(res != 1)\
        gep_erreur(1,"Cannot see an uint"#x" in '%s`\n",s);\
    return i;\
}
addfield_parse_uint(8);
addfield_parse_uint(16);
addfield_parse_uint(32);
addfield_parse_uint(64);

Quand je veux compiler ça, j'obtiens ce message d'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
D:\workspace\gliss\src\gep\gep_addfield.c: In function 'addfield_parse_uint8':
D:\workspace\gliss\src\gep\gep_addfield.c:16:1: error: expected ')' before 'SCNx8'
D:\workspace\gliss\src\gep\gep_addfield.c:16:1: error: expected ')' before 'SCNo8'
(j'ai changé le numéro de ligne pour que ça colle avec la balise code au-dessus, sympa la nouvelle balise)

Le problème c'est que je ne comprend pas grand chose aux macros.
Là je ne comprend pas vraiment où est le problème, est-ce que quelqu'un pourrait m'expliquer ? Je n'ai pas réussi à trouver d'explications suffisamment claires sur internet (je ne connais que les #define "de base" pour remplacer une chaine par une valeur).

Edit: Le compilateur ne renvoie d'erreur que pour la macro avec 8, celles avec 16, 32, 64 passent l'étape de la compilation.