web-dev-qa-db-fra.com

Que fait ## (double hachage) dans une directive de préprocesseur?

#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

La ligne ci-dessus est tirée d'Unreal 4, et je sais que je pourrais la poser sur les forums irréels, mais je pense que c'est une question C++ générale qui mérite d'être posée ici.

Je comprends que la première ligne définit une macro, mais je ne connais pas bien les manigances de préprocesseur en C++ et donc je suis perdu là-bas. La logique me dit que la barre oblique inverse signifie que la déclaration continue sur la ligne suivante.

FThreadSafeStaticStat ressemble un peu à un modèle, mais il y a un # là-dedans et une syntaxe que je n'ai jamais vue auparavant en C++

Quelqu'un pourrait-il me dire ce que cela signifie? Je comprends que vous n'avez peut-être pas accès à Unreal 4, mais c'est juste la syntaxe que je ne comprends pas.

76
DavidColson

## Est l'opérateur de préprocesseur pour la concaténation.

Donc, si vous utilisez

DEFINE_STAT(foo)

n'importe où dans le code, il est remplacé par

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

avant que votre code ne soit compilé.

Voici un autre exemple de n article de blog à moi pour l'expliquer davantage.

#include <stdio.h>

#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Stumped?\n");
}

Ce programme serait compilé et exécuté avec succès, et produirait la sortie suivante:

Stumped?

Lorsque le préprocesseur est appelé sur ce code,

  • begin est remplacé par decode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) est remplacée par m ## a ## i ## n
  • m ## a ## i ## n Est remplacé par main

Ainsi, en fait, begin() est remplacée par main().

148
Susam Pal