web-dev-qa-db-ja.com

プリプロセッサディレクティブで##(ダブルハッシュ)は何をしますか?

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

上記の行はUnreal 4からの抜粋であり、アンリアルフォーラムで質問することができますが、これは一般的なC++の質問であり、ここで質問する必要があると思います。

私は最初の行がマクロを定義していることを理解していますが、私はC++のプリプロセッサシェナニガンに精通していないので、そこに迷っています。バックスラッシュは、宣言が次の行に続くことを意味します。

FThreadSafeStaticStatはテンプレートに少し似ていますが、そこには#があり、C++ではこれまで見たことのない構文があります

誰かがこれが何を意味するのか教えてもらえますか? Unreal 4にアクセスできない可能性があることは理解していますが、それは単に理解できない構文です。

76
DavidColson

_##_は、連結用のプリプロセッサ演算子です。

だからあなたが使うなら

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()に置き換えられます。

148
Susam Pal