Que signifie ## pour le préprocesseur C (C ++)?

J’ai un programme C ci-dessous:

#define f(g,g2) g##g2 main() { int var12=100; printf("%d",f(var,12)); } 

quand je lance juste le préprocesseur, il étend cela comme

 { int var12=100; printf("%d",var12); } 

c’est la raison pour laquelle la sortie est 100.

Quelqu’un peut-il me dire comment / pourquoi le préprocesseur étend var##12 to var12 ?

rien d’extraordinaire: ## demande au préprocesseur de concaténer les côtés gauche et droit

voir http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

parce que ## est un opérateur de concaténation de jetons pour le préprocesseur c.

Ou peut-être je ne comprends pas la question.

## est l’ opérateur de collage de jetons

Le double signe de numéro ou l’opérateur de “collage de jetons” (##), parfois appelé opérateur de “fusion”, est utilisé à la fois dans les macros de type object et de type fonction. Elle permet de joindre des jetons distincts en un seul et ne peut donc pas être le premier ou le dernier jeton de la définition de macro.

Si un paramètre formel d’une définition de macro est précédé ou suivi par l’opérateur de collage de jetons, le paramètre formel est immédiatement remplacé par l’argument réel non développé. L’expansion de macro n’est pas effectuée sur l’argument avant son remplacement.

#define f(g,g2) g##g2

## est utilisé pour concaténer deux macros dans le pré-processeur c. Donc, avant de comstackr, f (var, 12) doit être remplacé par le préprocesseur avec var12 et vous obtenez donc le résultat.