假设我有一些文件,它们都有类似的名称:Foo1Bar.h
,Foo2Bar.h
,Foo3Bar.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
或其他什么来使其工作。
是否可能,如果可能,怎么样?如果没有,有没有确切的理由呢?
答案 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