【发布时间】: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_S 和ARCH_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?