2016-11-22 12 views
0

いくつかの自動化された方法でヘッダー階層を印刷したいと思います。目標は、ヘッダファイルインクルードの順序を保持することです。 ヘッダー階層を印刷する

#ifndef HIERARCHY_PRINTING 
#define HIERARCHY_PRINTING "start: " 
#endif 

#undef PREVIOUS_PRINTING 
#define PREVIOUS_PRINTING HIERARCHY_PRINTING "->" 
#undef HIERARCHY_PRINTING 
#define HIERARCHY_PRINTING PREVIOUS_PRINTING "tmp1.h" 

#ifndef _TMP1_ 
#define _TMP1_ 

// Some stuff 

#endif 

#undef PREVIOUS_PRINTING 
#define PREVIOUS_PRINTING HIERARCHY_PRINTING ";" 
#undef HIERARCHY_PRINTING 
#define HIERARCHY_PRINTING PREVIOUS_PRINTING 

そして "tmp.c" で

#include <stdio.h> 
#include "tmp1.h" 

const char *str = HIERARCHY_PRINTING; 

int main() { 
    printf("Headers hierarchy:\n"); 
    printf("%s\n", str); 

    return 0; 
} 

は、しかし、これはコンパイルされません:

は、私は次のヘッダ内の "tmp1.h" を行うことを試みた

tmp.c:7:19: error: ‘HIERARCHY_PRINTING’ undeclared here (not in a function) 
tmp.c:7:19: error: expected ‘,’ or ‘;’ before string constant 

私は次のようなものを期待していました:

start: ->tmp1.h; 

どこが間違っていますか?

+0

あなたが書いたマクロに循環参照があります: 'HIERARCHY_PRINTING'は' PREVIOUS_PRINTING'に展開され、次に 'HIERARCHY_PRINTING"; ''などに展開されます。これはコンパイルエラーですコードが少し違っているので、例を単純化したときに翻訳で何かが失われている可能性があります。 –

+0

@HaldeanBrownどのようなエラーがありましたか?実際には私は単なる実験なので何も簡素化していませんでした。 – Link42

+0

質問している動作を示すサンプルを投稿すると、より良いヘルプが得られます。コンパイルしたコードとコンパイラの出力は次のとおりです。http://lpaste.net/345138 –

答えて

1

HIERARCHY_PRINTINGが定義されていない場合、後で使用するマクロHIERARCHY_PRINTINGの内容を保存するPREVIOUS_PRINTINGマクロ定義に中間結果を保存しようとしました。

しかし、プリプロセッサは定義が必要になるまで展開しないので、このようなアプローチは機能しません。そして#undefコマンドはそれの前に定義されたものを投げ捨てるだけです。だからあなた例えば、プリプロセッサは、それが次のようになりますファイルのヘッダの取り扱いが終了したとき:

#define PREVIOUS_PRINTING HIERARCHY_PRINTING ";" 
#define HIERARCHY_PRINTING PREVIOUS_PRINTING 

を、それがHIERARCHY_PRINTINGの値を展開しようとしたときに再帰が禁止されているので、だから、HIERARCHY_PRINTING ";"を取得し、それということだろう。そして最後に、コンパイラは宣言されていないHIERARCHY_PRINTINGに対してこのような宣言がないので、コードに文句を言います。