我可以为#includes使用令牌粘贴和/或字符串化吗?

时间:2016-02-11 18:02:17

标签: c include c-preprocessor stringification

假设我有一些文件,它们都有类似的名称:Foo1Bar.hFoo2Bar.hFoo3Bar.h等等。现在,我想自动包含那些文件“插件”样式中的某些main.c,也就是说,我不想记住每个#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个带有公共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或其他什么来使其工作。

是否可能,如果可能,怎么样?如果没有,有没有确切的理由呢?

2 个答案:

答案 0 :(得分:1)

你不能使用:

#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)

答案 1 :(得分:1)

不完全是你想要的,因为#命令是由预处理器处理的,并且它看起来也看不到另一个#命令是否来自扩展但是有一些功能用于& #34;产生&#34; #include行,它们只是在#include文本本身之后......

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

在此搜索&#34; #include其他内容&#34;:https://www.slac.stanford.edu/comp/unix/gnu-info/cpp_1.html