Je me demandais pourquoi on ne peut pas utiliser un jeton de concaténation à l'extérieur de l' define
s.
Cela arrive lorsque je veux en même temps:
- libre de conflit de nommage dans une bibliothèque (ou "génériques")
- debugability; lors de l'utilisation d'un
define
puis l'ensemble du code est fusionné en une ligne et le débogueur affiche uniquement la ligne où l'define
a été utilisé
Certaines personnes pourraient vous voulez un exemple (question réelle est en-dessous):
lib.inc:
#ifndef NAME
#error includer should first define NAME
#endif
void NAME() { // works
}
// void NAME##Init() { // doesn't work
// }
principal.c:
#define NAME conflictfree
#include "lib.inc"
int main(void) {
conflictfree();
// conflictfreeInit();
return 0;
}
Erreur:
In file included from main.c:2:0:
lib.h:6:10: error: stray '##' in program
void NAME##Init();
^
La règle de base est "concat seulement à définir". Et si je me souviens bien: La raison en est que le préprocesseur-phases.
Question: Pourquoi n'est-il pas de travail. Les phases d'argument sonne comme il était une fois une mise en œuvre-limitation (au lieu d'une logique de la raison) et puis a trouvé son chemin dans la norme. Ce qui pourrait être si difficile à accepter NAME##Init()
si NAME()
fonctionne bien?