我可以在宏中嵌套 `#include` 吗?
Can I nest `#include` in a macro?
我正在构建一个可以由第三方扩展的后端接口,我希望添加一个新的后端模块尽可能简单。
为此,我想通过只需要向 X 宏添加一个条目来自动包含未知头文件:
store.h
:
#define BACKEND_TBL \
ENTRY(HTABLE, "store_htable.h", htstore, htiter) \
ENTRY(MDB, "store_mdb.h", mdbstore, mdbiter)
/* Add more here */
typedef enum store_type {
#define ENTRY(a, b, c, d) STORE_##a,
BACKEND_TBL
#undef ENTRY
} StoreType;
store.c
:
#include "store.h"
#define ENTRY(a, b, c, d) #include b
BACKEND_TBL
#undef ENTRY
我得到一个错误:# is not followed by a macro parameter
。
我试图在 #include
之前转义 #
,因为那是一个字符串化标记,但仍然不起作用。
这在 C 中是否可行?
不,这是不可能的。虽然你可以,比如说,#define MYHDR <header.h>
然后#include MYHDR
,宏替换是在词法预处理器命令之后执行的。如果你做了 #define INCLUDE_FOO #include <foo.h>
(并以某种方式通过预处理器得到它,而不是将其视为字符串化),那么添加 INCLUDE_FOO
只会在 post-preprocessor 中产生文本 #include <foo.h>
source,编译时会出现语法错误。
或者,你可以这样做,
使用宏来控制定义块,
#ifdef USE_HTABLE
#include <htabl.h>
#endif
#ifdef INCLUDE_MDB
#include <MDB.h>
#endif
当你需要的时候,
#define INCLUDE_MDB
我正在构建一个可以由第三方扩展的后端接口,我希望添加一个新的后端模块尽可能简单。
为此,我想通过只需要向 X 宏添加一个条目来自动包含未知头文件:
store.h
:
#define BACKEND_TBL \
ENTRY(HTABLE, "store_htable.h", htstore, htiter) \
ENTRY(MDB, "store_mdb.h", mdbstore, mdbiter)
/* Add more here */
typedef enum store_type {
#define ENTRY(a, b, c, d) STORE_##a,
BACKEND_TBL
#undef ENTRY
} StoreType;
store.c
:
#include "store.h"
#define ENTRY(a, b, c, d) #include b
BACKEND_TBL
#undef ENTRY
我得到一个错误:# is not followed by a macro parameter
。
我试图在 #include
之前转义 #
,因为那是一个字符串化标记,但仍然不起作用。
这在 C 中是否可行?
不,这是不可能的。虽然你可以,比如说,#define MYHDR <header.h>
然后#include MYHDR
,宏替换是在词法预处理器命令之后执行的。如果你做了 #define INCLUDE_FOO #include <foo.h>
(并以某种方式通过预处理器得到它,而不是将其视为字符串化),那么添加 INCLUDE_FOO
只会在 post-preprocessor 中产生文本 #include <foo.h>
source,编译时会出现语法错误。
或者,你可以这样做, 使用宏来控制定义块,
#ifdef USE_HTABLE
#include <htabl.h>
#endif
#ifdef INCLUDE_MDB
#include <MDB.h>
#endif
当你需要的时候,
#define INCLUDE_MDB