いくつかの自動化された方法でヘッダー階層を印刷したいと思います。目標は、ヘッダファイルインクルードの順序を保持することです。 ヘッダー階層を印刷する
#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;
どこが間違っていますか?
あなたが書いたマクロに循環参照があります: 'HIERARCHY_PRINTING'は' PREVIOUS_PRINTING'に展開され、次に 'HIERARCHY_PRINTING"; ''などに展開されます。これはコンパイルエラーですコードが少し違っているので、例を単純化したときに翻訳で何かが失われている可能性があります。 –
@HaldeanBrownどのようなエラーがありましたか?実際には私は単なる実験なので何も簡素化していませんでした。 – Link42
質問している動作を示すサンプルを投稿すると、より良いヘルプが得られます。コンパイルしたコードとコンパイラの出力は次のとおりです。http://lpaste.net/345138 –