2016-04-20 8 views
5

マクロ自体の情報を使ってC++ #defineマクロを再定義することはできますか?私は以下のコードを試しましたが、マクロが評価される方法のため、出力は私が期待したものではありませんでした。マクロ自体の情報を使ってC++ #defineマクロを再定義するには?

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" // Want ABCDEF 

#undef FINAL_DEFINE 
#define FINAL_DEFINE NEW_DEFINE // Want ABCDEF, but get empty? 


int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Want ABCDEF, but doesn't compile. 
} 
+0

私は質問をより明確に更新しました。まだあいまいかどうか私に教えてください。 – Jeff

+0

基本的には:Chris Doddの答えが説明しているとおり、不可能です。回避策として、中間定義(最初の2行のFINAL_DEFINE)に別の名前を使用する必要があります。 –

答えて

0

コンパイラがpush_macro & pop_macroプラグマディレクティブをサポートしている場合、あなたはこれを行うことができます:コード内のすべてのFINAL_DEFINEを前処理した後

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" 

int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Output ABC 

    #pragma push_macro("FINAL_DEFINE") 
    #define FINAL_DEFINE "XXX" 
    std::cout << NEW_DEFINE << std::endl; // Output XXXDEF 
    #pragma pop_macro("FINAL_DEFINE") 
} 
0

最後に置き換えられますそれが定義され、その後、予定をコンパイルのステップまで。

マクロを再定義することはできません。

あなたのコンパイラはそれについて警告する必要があります。

+0

コードは合法です。どんなコンパイラが警告しますか? –

+0

警告は、それが違法であるということではありません。同じマクロが別の場所で定義されている場合、大きなプロジェクトではマクロの再定義に関する警告が役立ちます。 – Nik

+0

OPはMACROを定義解除するので、再定義はありません... – Jarod42

1

マクロボディ内のマクロはではありません。マクロが定義されているときには、マクロが使用されているときにのみ展開されます。これは、NEW_DEFINEの定義がではなく、"ABC" "DEF"であることを意味します。#define行に表示されるのはまさにFINAL_DEFINE "DEF"です。

FINAL_DEFINEを使用すると、NEW_DEFINEに展開され、FINAL_DEFINE "DEF"に拡張されます。この時点では、再帰的にFINAL_DEFINEを展開することはありません(無限ループにつながる)ので、これ以上の展開は起こりません。

関連する問題