我可以为#includes 使用标记粘贴 and/or 字符串化吗?

Can I use token-pasting and/or stringizing for #includes?

假设我有几个文件,它们的名称都相似:Foo1Bar.hFoo2Bar.hFoo3Bar.h 等。现在,我想自动包含那些 main.c 中的 "plug-in" 风格,也就是说,我不想记住每个 #include。是否可以通过标记粘贴来做到这一点?到目前为止,我有:

// this is the only line I want to have to change if I add Foo4Bar.h
#define FOR_EACH_FOOBAR(T) T(1)T(2)T(3)
//... somewhere else in my code
#define RUN_SOME_FUNC(T) Foo##T##Bar().run();

并且上面的工作正常(当然假设我所有的 Foo*Bar.h 文件都有 类 Foo*Bar 和 public run() 方法。(以防万一目前还不清楚,我这里的例子是 C++,但我不认为问题本身,#include,是 C++ 特定的)。

我无法梳理的是我是否也可以用我的 #include 语句来做到这一点。而不是

#include <Foo1Bar.h>
#include <Foo2Bar.h>
#include <Foo3Bar.h>
#include <Foo4Bar.h>

(对我而言)更改以下内容会更好:

FOR_EACH_FOOBAR(T) T(1)T(2)T(3)T(4)
FOR_EACH_FOOBAR(INCLUDE)

我试过了:

#define INCLUDE(T) #include <Foo##T##Bar.h>

但出现错误:'#' is not followed by a macro parameter,因为它试图将开始部分字符串化。我尝试过的任何卷积或回转都会导致相同(或类似)的错误,而且我无法弄清楚如何逃避 #include 或任何使它起作用的方法。

这可能吗?如果可能的话,怎么做?如果不是,是否有确切的原因?

您不能使用:

#define INCLUDE(T) #include Foo##T##Bar.h

因为 # 被用作对参数进行字符串化的运算符。

#define STR(x) #x

char const* s = STR(THIS);

与使用相同:

char const* s = "THIS";

鉴于此,

#define INCLUDE(T) #include Foo##T##Bar.h

遇到include不是宏参数之一的问题。因此,使用 #include 是不合法的。

更新

我认为标准的 C 预处理器功能不能用于完成您希望完成的任务。就个人而言,我更愿意看到

#include <Foo1Bar.h>
#include <Foo2Bar.h>
#include <Foo3Bar.h>
#include <Foo4Bar.h>

在我的文件中比

FOR_EACH_FOOBAR(T) T(1)T(2)T(3)T(4)
FOR_EACH_FOOBAR(INCLUDE)

不完全是你想要的,因为 # 命令由预处理器处理,它看起来不太清楚扩展是否产生了另一个 # 命令,但是 # 命令有一些功能 "generating" #include 行,它们只是在 #include 文本本身之后...

https://gcc.gnu.org/onlinedocs/cpp/Computed-Includes.html

在这里搜索“#include anything else”:https://www.slac.stanford.edu/comp/unix/gnu-info/cpp_1.html