[macros] "does not give a valid preprocessing token&quo
Bonjour,
Le code suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
#include <stdlib.h>
#include <stdio.h>
#define DBG 1
#if DBG
#define P(x) \
printf ("X.%s = %u\n", #x, X. ## x)
#else
#define P(x)
#endif
#define UPD(x, v) \
do \
{ \
X. ## x = v; \
X.modif = 1; \
P (x); \
} \
while (0)
int main (void)
{
struct
{
int a;
int modif;
}
X;
UPD (a, 123);
system ("pause");
return 0;
} |
donne les informations suivantes (Dev-c++ 4.9.9.0 avec gcc/mingw 3.3.1):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Compilateur: Default compiler
Building Makefile: "D:\DevCpp\ed\Makefile.win"
Exécution de make...
make.exe -f "D:\DevCpp\ed\Makefile.win" all
gcc.exe -c main.c -o main.o -I"D:/DEV-CPP/include" -W -Wall -O2
main.c:31:15: pasting "." and "a" does not give a valid preprocessing token
main.c:31:15: pasting "." and "a" does not give a valid preprocessing token
gcc.exe main.o -o "ed01.exe" -L"D:/DEV-CPP/lib"
Exécution terminée |
Dans un projet plus gros, j'ai une foule de messages de ce genre, et la compilation est interrompue.
J'ai du mal à voir si c'est un problème de syntaxe (ok avec BC 3.1) de compilateur (gcc 3.3.1 serait plus 'picky') ou d'environnement (Dev-c++, config 'cachée' du compilateur)
Après consultation du net, je penche pour un problème de la version 3 de gcc. Ce problème à l'air connu, mais j'ai du mal à trouver une explication claire sur le net. Beaucoup de questions et pas de réponse à ma connaissance. (Jamais eu ce problème avec les versions gcc 3.2,x et 3.1.x).
Si quelqu'un en sais plus, je suis tout ouïe.
[EDIT]En fait il s'agit du bug 7976 (bugzilla) connu depuis gcc 3.1.x.
D'après
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7976
ce n'est pas un bug, mais une non conformité à la norme (probablement supportée silencieusement par de nombreuses implémentations) qui est maintenant signalée.
Il semblerait qu'il faille passer par des fonctions de concaténation à plusieurs niveau pour arriver à ses fins...
Je vais avoir pas mal de code à mettre à jour...
[/EDIT]
Emmanuel
Re: [resolu] "does not give a valid preproc. token"
Citation:
Envoyé par Emmanuel Delahaye
Code:
1 2 3
|
#define P(x) \
printf ("X.%s = %u\n", #x, X. ## x) |
En épluchant quelques newsgroup (clc, notamment), j'ai fini par comprendre que dans ce cas, il ne fallait pas faire de concaténation :
Code:
1 2 3
|
#define P(x) \
printf ("X.%s = %u\n", #x, X.x) |
est correct et ne fait plus de warning.
En fait, avec les ## (dans ce cas là) le comportement est indéfini et gcc, dans sa grande mansuétude, nous le signale, alors que la plupart des compilateurs avalent ça sans broncher.
Lundi matin, maintenance!