如何在#include指令中使用宏

How to use a macro in an #include directive?

本文关键字:指令 #include      更新时间:2023-10-16

我对如何在#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++/:没有这样的文件或目录# include  "../../../../lib/libc++/" ARCH_FAMILY_S "/" ARCH_S "/stkl/printkc/printkc.h"之前

是否有办法成功地将ARCH_FAMILY_SARCH_S附加到我的#include指令字符串?

您可以使用一系列宏来创建包含文件。不幸的是,我想不出任何更干净的(内部)方法来做到这一点。这适用于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)