2016-10-15 3 views
6

#include指示文でマクロを使用する方法が混乱しています。マクロを#includeディレクティブで使用する方法は?

#include "../../../../GlobalDefintions.h" 
#include "../../../../lib/libc++/" ARCH_FAMILY_S "/" ARCH_S "/stkl/printkc/printkc.h" 

GlobalDefintions.h:私はこれをやった

#ifndef _GlobalDefintions_ 
#define _GlobalDefintions_ 

/*Architecture Information Start*/ 


#define ARCH i386 
#define ARCH_FAMILY x86 


#define ARCH_S "i386" 
#define ARCH_FAMILY_S "x86" 

/*Architecture Information End*/ 

#endif /*_GlobalDefintions_*/ 

しかしそれは私を与えることはこれです:

kernel.c++:24:88: fatal error: ../../../../lib/libc++/: No such file or directory 

#include "../../../../lib/libc++/" ARCH_FAMILY_S "/" ARCH_S "/stkl/printkc/printkc.h" 

が正常 ARCH_FAMILY_Sを追加する方法があると ARCH_Sと私の #include指示文字列?

+1

一般的に、この内容はコンパイラによって異なり、非常に脆弱です。代わりに、コンパイラのヘッダーインクルードパスオプションおよび/または環境変数を介してインクルードするヘッダーの選択を制御します。例えば。 g ++の場合は 'CPATH'、Visual C++の場合は' INCLUDE'です。 –

+1

連結の場合、連結マクロを定義することができます。しかし、やはり、コンパイラに依存します。インクルードディレクティブでマクロを使うという一般的なアプローチがうまくいかないことに気がつくまで、本当に苦労していました。 –

+0

これを見て:http://stackoverflow.com/questions/9096201/concatenate-string-in-c-include-filename – n3m4nja

答えて

3

一連のマクロを使用してインクルードファイルを作成できます。残念ながら、私はこれを行うクリーナー(インソース)の方法を考えることができません。これはarm-eabi-none-gcc v5.4.1で動作します。

#define LIBC_DIR ../../../../lib/libc++/ 

#define STRINGIFY_MACRO(x) STR(x) 
#define STR(x) #x 
#define EXPAND(x) x 
#define CONCAT(n1, n2) STRINGIFY_MACRO(EXPAND(n1)EXPAND(n2)) 
#define CONCAT5(n1, n2, n3, n4, n5) STRINGIFY_MACRO(EXPAND(n1)EXPAND(n2)EXPAND(n3)EXPAND(n4)EXPAND(n5)) 

// Concatenate the five elements of your path. 
// Of course, this can be simplified if there is only a prefix and a suffix 
// that needs to be added and the ARCH_FAMILY, /, and ARCH are always present 
// in the macro-generated #include directives. 
#include CONCAT5(LIBC_DIR,ARCH_FAMILY,/,ARCH,/stkl/printkc/printkc.h) 
+1

これはわかりません。 ../../../../ lib/libC++/\ "x86 \"/\ "i386 \" /stkl/printkc/printkc.h:このようなファイルやディレクトリはありませんが、これは不思議なフォーマットです – AndyG

+0

'kernel.C++:32:78:致命的なエラー:../../../../ lib/libC++/\" x86 \ "/ \" i386 \ "/ stkl/printkc/printkc .h:そのようなファイルやディレクトリはありません。 ' – amanuel2

+0

申し訳ありません...末尾に '_S'が付いているのではなく、' ARCH'と 'ARCH_FAMILY'を使う必要があります。私は私の答えを更新しました。 – lungj

関連する問題