2015-01-08 13 views
11

言って、私は自分自身を読みたくないけどこれは、私は含まれません、ヘッダー、で、私は今マクロの定義を文字列リテラルとして取得する方法は?

#define A B 
#define B C 

を持って

#define STR(name) # name 

は私のように任意のマクロの名前を与えるマクロを定義します文字列であり、

は、すべてのマクロを文字列として完全に展開するマクロを定義しています。従って

cout << STR(A) << EXP_STR(A) << endl; 

は、ACを印刷します。

マクロを使用してAから"B"を取得する方法はありますか?

+2

わからない。私はこれがCのトークン拡張がどのように機能するかによって可能ではないと信じています。これは非常に良い質問です。 – fuz

+0

それは素晴らしい質問ですが、私はこれが不可能であることをほとんど確信しています。誰かがそれを知っていることを願っています。 –

+2

可能な複製[Cプリプロセッサでのダブルマクロ置換の回避](http://stackoverflow.com/questions/27533994/avoiding-a-double-macro-subsitution-in-the-c-pre-processor) – this

答えて

1

あなたは

#define B C 
#define A B 

#define STR(name) # name 
#define EXP_STR(name) STR(name) 

cout << STR(A) << EXP_STR(A) << endl; 

意志出力exaclty同じことを書くことができますので、それは可能ではないということを意味します。

あなたはこの

#define A B 

、その後

#define B C 

を行うと、今これはACなくBによって置換されることを意味し、そのため、ときにそれを行うには方法がないだろうcout行に到達しました。プリプロセッサーはすでにACに置き換えました。

だから、短い答えは、ファイルがコンパイルされる前に、プリプロセッサはCAを交換していたので、それはことはできません、です。

+0

'#define AB'の行は、AがCであると定義していないことに注意してください。BがCであると定義されているからです。' #undef B'、 '#define BX'、' cout << STR(A)<< "" << EXP_STR(A)<< endl; '、出力はAXです。展開は、マクロが定義されていないときに呼び出されたときに行われます。いくつかの言語([make](https://www.gnu.org/software/make/manual/html_node/Flavors.html))は、それをどのようにして自分自身で決めることさえできません。 –

+0

@ not-a-userあなたのコメントを見る前に私は自分の答えを投稿しましたが、私はこれを行う良い方法を提供しています... –

0

ええ、それは可能です。あなたはちょうどチートのカップルを使用する必要があります。 #define EXP_STR

    • #undef Bは、例えば間接

    のいくつかのより多くのレベルを使用します。

    #define A B 
    #define B C 
    
    #define _TEMP_VAR B // so that it can be redefined later 
    #undef B    // so that EXP_STR(A) will return "B" 
    
    #define EXP_STR__(x) (x) 
    #define EXP_STR_(x) EXP_STR__(#x) 
    #define EXP_STR(x) EXP_STR_(x) 
    
    #define STR(x) # x 
    
    #define B _TEMP_VAR // now you can still access A normally, defined to B (defined to C) 
    

    それを証明するために、テストプログラム:

    #include <stdio.h> 
    
    int main(void) 
    { 
        printf("EXP_STR(A) = %s\n", EXP_STR(A)); 
        printf("STR(A)  = %s\n", STR(A)); 
    } 
    

    出力:

    EXP_STR(A) = B 
    STR(A)  = A 
    
  • +0

    少しこれを明確にすることができますか?私たちは、印刷できるようにしたいすべてのマクロに対してこのコードをすべて実行しなければなりませんか?それとも一度ですか? – Vality

    +0

    @Vality '#define _TEMP_VAR'の前に' EXP_STR'を使用するマクロを定義します。 –

    +0

    ありがとう、upvoted。 – Vality

    関連する問題