Standard alternative de GCC ##__VA_ARGS__ tromper?

Il y a un bien connu problème avec vide d'argument pour variadic macros en C99.

exemple:

#define FOO(...)       printf(__VA_ARGS__)
#define BAR(fmt, ...)  printf(fmt, __VA_ARGS__)

FOO("this works fine");
BAR("this breaks!");

L'utilisation de BAR() ci-dessus est en effet incorrect selon le standard C99, car elle sera étendue à d':

printf("this breaks!",);

Notez la virgule - pas réalisable.

Certains compilateurs (ex: Visual Studio 2010) va tranquillement se débarrasser de la virgule pour vous. D'autres compilateurs (par exemple: GCC) favoriser la mise ## en face de __VA_ARGS__, comme suit:

#define BAR(fmt, ...)  printf(fmt, ##__VA_ARGS__)

Mais est-il conforme aux normes façon d'obtenir ce comportement?
Peut-être à l'aide de plusieurs macros?

Droit maintenant, le ## version semble assez bien pris en charge (au moins sur mes plates-formes), mais j'aimerais vraiment utiliser plutôt conforme aux normes de la solution.

De préemption: je sais que je pourrais juste écrire une petite fonction. Je suis en train de le faire à l'aide de macros.

Modifier: Voici un exemple (mais simple) de pourquoi je veux utiliser la BARRE():

#define BAR(fmt, ...)  printf(fmt "\n", ##__VA_ARGS__)

BAR("here is a log message");
BAR("here is a log message with a param: %d", 42);

Cela ajoute automatiquement un saut de ligne à mon BAR() enregistrement des déclarations, en supposant fmt est toujours un double de la cité, le C-string. Il n'a PAS l'impression que le saut de ligne séparés comme printf(), ce qui est avantageux si l'enregistrement est en ligne de tampon et provenant de sources multiples de manière asynchrone.

  • Pourquoi utiliser BAR au lieu de FOO en premier lieu?
  • J'ai ajouté un exemple à la fin
  • Dans ce cas, vous pouvez simplement faire un multi-déclaration de la macro avec un printf("\n"); à la fin.
  • Lire la dernière phrase (:
  • Cette fonction a été proposé d'inscrire dans C2x.
  • Auriez-vous par hasard à connaître l'état de cette proposition dès maintenant (un peu plus d'un an plus tard)?
  • la dernière version soumise à WG14 ressemble à ceci, qui utilise une nouvelle syntaxe __VA_OPT__ mot-clé. Cette a déjà été "adopté" en C++, donc je m'attends C suivront. (ne sais pas si cela signifie qu'il a été accélérée en C++17 ou si elle est définie pour le C++20 si)

InformationsquelleAutor jwd | 2011-04-07