1. ホーム
  2. c++

[解決済み] プリプロセッサー指示文の##(ダブルハッシュ)は何を意味しているのですか?

2022-05-18 12:22:28

質問

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

上の行はUnreal 4から取ったもので、Unrealフォーラムで質問できることは知っていますが、これはここで質問されるに値する一般的なC++の質問だと考えています。

最初の行がマクロを定義していることは理解していますが、私は C++ のプリプロセッサの悪ふざけについてよく知らないので、そこで迷っています。論理的には、バックスラッシュは、次の行に宣言が続くことを意味します。

FThreadSafeStaticStat は少しテンプレートのように見えますが、# があり、C++ では見たことのない構文があります。

これが何を意味するのか、誰か教えてください。Unreal 4 にアクセスできないかもしれないことは理解していますが、構文がわからないのです。

どのように解決するのですか?

## は連結のためのプリプロセッサー演算子です。

ですから、もしあなたが

DEFINE_STAT(foo)

に置き換わります。

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

のように、コードがコンパイルされる前に

もう一つの例です。 ブログの記事 からの例です。

#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");
}

このプログラムは正常にコンパイル・実行され、次のような出力が得られます。

Stumped?

このコードに対してプリプロセッサが起動されたとき。

  • begindecode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) は次のように置き換えられます。 m ## a ## i ## n
  • m ## a ## i ## n は次のように置き換えられます。 main

このように効果的に begin()main() .