Que fait l’opérateur # dans les macros?

#include  #define foo(x, y) #x #y int main() { printf("%s\n", foo(k, l)); return 0; } 

Sortie:
kl

Je sais que ## fait la concaténation. À la sortie, il semble que # également la concaténation. Ai-je raison?

Si j’ai raison, quelle est la différence entre l’opérateur ## et l’opérateur # ?

# transforme l’argument en chaîne. Ainsi foo(k, l) devient "k" "l" , ce qui est identique à "kl" car en C, plusieurs littéraux de chaîne directement adjacents sont traités comme des littéraux de chaîne unique.

Si # concaténait, votre appel à printf deviendrait printf("%s\n", kl); ce qui produirait une erreur sur le fait que kl n’est pas défini.

## concatène les deux arguments, # quotes (“Ssortingngification”). Alors le compilateur voit:

 printf("%s\n", "k" "l"); 

Si vous utilisez GCC, utilisez -E pour afficher le résultat du préprocesseur.

Cette question contient des détails sur la concaténation de littéraux de chaîne: Implémentation de la concaténation de littéraux de chaîne en C et C ++