【问题标题】:How to use a macro in an #include directive?如何在#include 指令中使用宏?
【发布时间】:2016-10-15 18:46:02
【问题描述】:

我对如何在#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: 致命错误: ../../../../lib/libc++/: 没有这样的文件或目录

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

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

【问题讨论】:

  • 一般这个东西依赖于编译器,而且非常脆弱。相反,通过编译器的头文件包含路径选项和/或环境变量来控制要包含的头文件的选择。例如。 CPATH 用于 g++,INCLUDE 用于 Visual C++。
  • 对于连接,您可以定义一个连接宏。但同样,这取决于编译器。我记得我一直在为此苦苦挣扎,直到我意识到在包含指令中使用宏的一般方法并不好。
  • @Cheersandhth.-Alf 我正在使用 Makefiles,因为我正在编写操作系统,所以我使用交叉编译器,例如 i686-elf-g++
  • 字符串连接发生在预处理器完成后。预处理器不允许这些恶作剧。在我的书中,您应该在编译器命令行上而不是在源代码中指定目录。另见What are the benefits of a relative path such as "../include/header.h" for a header?

标签: c++ macros include


【解决方案1】:

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

【讨论】:

  • 我不确定这是否有效。我收到的消息是致命错误:../../../../lib/libc++/\"x86\" /\"i386\" /stkl/printkc/printkc.h: 没有这样的文件或目录,看起来格式很奇怪
  • kernel.c++:32:78: fatal error: ../../../../lib/libc++/\"x86\" /\"i386\" /stkl/printkc/printkc.h: No such file or directory
  • 对不起...您需要使用ARCHARCH_FAMILY 而不是_S 后缀的版本。我已经更新了我的答案。
  • 另外,为了避免忘记同时更新ARCH_SARCH(同样,对于家庭),您可以使用我提供的STR宏来定义ARCH_S作为STR(ARCH)
  • 现在是致命错误:../../../../lib/libc++/x86 /1 /stkl/printkc/printkc.h: 没有这样的文件或目录
猜你喜欢
  • 2016-01-26
  • 2015-11-11
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多