【发布时间】:2016-02-11 18:02:17
【问题描述】:
假设我有几个文件,它们的名称都相似: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++,但我不知道) t 认为问题本身(#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 或其他任何方法来使其正常工作。
有可能吗?如果有,怎么做?如果没有,是否有确切的原因?
【问题讨论】:
-
我知道这一点,我也去过那里。那时人们希望拥有类似 Lisp 的宏 :) 我想与其尝试“在”源文件中执行此操作,不如在构建过程中添加一个步骤来生成包含所有这些内容的
AllFooBars.h标头。 -
@DanielJour 哦,好点,我没有考虑源文件之外的任何内容,但这听起来很合理。感谢您的想法 - 无论是否可以在 C 中完成,构建可能都是要走的路。
-
底线是:不允许使用预处理器宏扩展来生成预处理器指令。所以,你不能生成
#include指令。使用#include,可以通过宏指定文件名,但这就是你所能做的。
标签: c include c-preprocessor stringification