2013-11-21 13 views
7

文字列演算子#を使用しようとしていますが、エラーstray ‘#’ in programが表示されます。私はそれをどのように使用しているのですか?C/C++の文字列演算

#define STR "SOME_STRING" 
#define BM 8 
#define NUM_OF_THREADS 8 
#define VER_STR (STR #BM #NUM_THREADS) 

私は​​ためSOME_STRING88を取得する代わりに、エラーを得ることを期待。私は何をしているのですか?

答えて

9

数値定数を文字列に変換する必要があります。ただし、構文がマクロパラメータに対してのみ有効なので、#BMはエラーです。 したがって、強制的に中間マクロを通して展開する必要があります。そして、あなたは同様にそれを行うには文字列化マクロを持っていることがあります。

#include <iostream> 

#define STRINGIFY_(x) #x 
#define STRINGIFY(x) STRINGIFY_(x) 

#define STR "SOME_STRING" 
#define BM 8 
#define S_BM STRINGIFY(BM) 
#define NUM_OF_THREADS 8 
#define S_NUM_OF_THREADS STRINGIFY(NUM_OF_THREADS) 
#define VER_STR STR S_BM S_NUM_OF_THREADS 

int main() { 
    // your code goes here 
    std::cout << VER_STR; 
    return 0; 
} 

あなたはマグナスHoff氏が指摘したように、あなたは文字列化を呼び出すことができますhttp://ideone.com/cR1KZP

EDIT

でアクションで上記を見ることができます

#define VER_STR STR STRINGIFY(BM) STRINGIFY(NUM_OF_THREADS) 
+0

'#BM'は' 'BM ''を与えません。コンパイルエラーです。 '# 'は、関数型マクロのパラメータでのみ使用できます。 – Angew

+0

@Angew、fixed。私はそれを書いている間、不完全な解決策を念頭に置いていました。 – StoryTeller

+1

完全性のために: '#_def VER_STR STRINGIFY(BM)STRINGIFY(BM)STRINGIFY(NUM_OF_THREADS)'を持つ中間 'S _...' -macrosなしでも動作します:http://ideone.com/hbBQIp –

関連する問題