我可以为#includes 使用标记粘贴 and/or 字符串化吗?
Can I use token-pasting and/or stringizing for #includes?
假设我有几个文件,它们的名称都相似:Foo1Bar.h
、Foo2Bar.h
、Foo3Bar.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
假设我有几个文件,它们的名称都相似:Foo1Bar.h
、Foo2Bar.h
、Foo3Bar.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