2013-05-16 7 views
5

マクロを使用して文字列定数を前処理トークンに変換したい。 例:文字列定数をCの前処理トークンに変換する方法

 

    // get the first character of marco argument to postfix of new data type. 
    #define TYPE(typename) Prefix ## typename #typename[0] 
    void main() 
    { 
     TYPE(int) a, b, c; // Prefixinti a, b, c; 
     TYPE(float) x, y, z; // Prefixfloatf x, y, z; 
     a = 3; 
    } 

C/C++では可能ですか?
p/s:貧しい私の英語には申し訳ありません。
それもC++でテンプレートと、ことはできません

+8

ストリング化はできません。ストリング化はできません。 – chris

+0

しかし定数にカンマが含まれていない限り、必要なものはすべて必要です。 – Medinoc

+3

非常に試しましたが、もう抵抗できません:**どうしてですか?** – WhozCraig

答えて

0

を編集しました。ちなみに、Cコードで 'typename'を使用しないでください。これはC++のキーワードであるため、Cコードを移植するのは難しいでしょう。

また、void main()は厳密に移植性がありません。代わりにint main()を使用してください。

+3

'typename'はプリプロセッサがコンパイラの前で実行されるので違いはありません。 – chris

+0

真実だけどまだいたずらはないと思いますか? – Bathsheba

1

プリプロセッサが何をしているのかを常に覚えておく必要があります。コンパイラが見る前にソースコードを変更します。

これは(私はint型の前後に引用符を削除)コンパイルしますが、それほど便利ではありませんん:あなたは、コンパイラに送られた次のコードで結果をやっている

#define TYPE(typename) typename 

void main() 
{ 
    TYPE(int) a, b, c; 
    a = 3; 
} 

何:

TYPE("int") a, b, c; 

文字列定数が宣言されていない識別子のカップルが続いている

"int" a, b, c; 

、whic「の結果結果が構文エラーになる

+0

Xマクロを使用してユーザー定義のデータ型を作成したい。例:OpenGLで。 GLPoint3i、GLPoint3f:データ型の最初の文字(int、float)を自分のデータ型の後置にします。 – dangkhoasdc

+1

私はopenGL変数がtypedefを使って作成されると思います。 http://en.wikipedia.org/wiki/X_Macroを見てください。ここでXマクロの使い方を見ることができます。 – hetepeperfan

3
#define TYPE(first_letter, rest) Prefix ## first_letter ## rest ## first_letter 

typedef int TYPE(i,nt); 
typedef float TYPE(f,loat); 

int main(void) 
{ 
    TYPE(i,nt) a, b, c; // Prefixinti a, b, c; 
    TYPE(f,loat) x, y, z; // Prefixfloatf x, y, z; 
} 
+0

もっと良い解決策はありますか?私は 'TYPE(int)a、b、c; // Prefixiniti a、b、c;'が必要です – dangkhoasdc

+0

いいえ、私は別の解決策を知りません。 – pmg

関連する問題