0

私はもともとMSVCで作成されたいくつかのコードに取り組んでおり、Clangで(Xcodeを使用して)コンパイルしようとしています。私が持っているコードは次のようなものです:

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x##"Map" );\
    myRemaps[map##x] = GetHandle( #x##"Remap" );

"Height""Map"現在、貼り付けによって文字列が形成されたというビルド エラーが発生しています"HeightMap"。このコードは MSVC で動作します。Clang のマクロ構文について、この種のものを別の方法で記述する必要があることを意味するものはありますか?

4

4 に答える 4

3

Cでは、"X""Y"はと同等"XY"です。ただし、そのようなことをマクロで記述する場合は、次のようになります。

str1##str2

2つを1つのトークンとして連結するようにレクサーに指示しています。"X""Y"は実際にはレクサー1によって連結された2つのトークンですが、"X"##"Y"1つのトークン(有効なトークンではありません)であると想定されています。

必要なのは、単にドロップすることです##

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x "Map" );\
    myRemaps[map##x] = GetHandle( #x "Remap" );

1または、実装に応じてセマンティクスアナライザー


通常、文字列に一致する正規表現は次のようになります(簡略化)。

"(a|\b)*"

a(エスケープする必要のないすべての文字のリストであり 、他の文字であると想定しbます)。おそらく、MSVCの場合、次のように定義されます。

"(a|\b)*"s*+

s空白です)

これは、MSVCがおそらく"X" "Y"2つではなく1つのトークンと見なすことを意味します。

于 2012-09-17T13:16:59.487 に答える
2

(#x "Map")の代わりに使用して#x##"Map"ください。C++で動作するはずです。たとえば、これは完全に有効です:("B" "Map")と評価され"BMap"ます。

于 2012-09-17T13:17:00.510 に答える
1

実際には、解析されたとき"Height""Map"と同じであることに注意してください。"HeightMap"したがって、これを簡単に使用できます。

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x "Map" );\
    myRemaps[map##x] = GetHandle( #x "Remap" );
于 2012-09-17T13:16:04.383 に答える
1

代わりにこれを試してください:

#define DO_MAPPING(x,y,z)\
    myMaps[map##x] = GetTex( #x "Map" );\
    myRemaps[map##x] = GetHandle( #x "Remap" );

2つの文字列文字は、コンパイラによって自動的に連結されます。

于 2012-09-17T13:16:14.927 に答える