我可以在宏中嵌套 `#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