2016-10-15 110 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_SARCH_S到我的#include指令字符串?

+1

通常這個東西取決於編譯器,而且非常脆弱。相反,通過編譯器的頭部包含路徑選項和/或環境變量來控制頭部的選擇。例如。用於g ++的'CPATH'和用於Visual C++的'INCLUDE'。 –

+1

對於連接,你可以定義一個連接宏。但是,這又取決於編譯器。我記得真的很掙扎,直到我意識到在include指令中使用宏的一般方法是不合適的。 –

+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

對不起......你需要使用'ARCH'和'ARCH_FAMILY'來替代'_S'後綴的版本。我已經更新了我的答案。 – lungj