【问题标题】:Include different file with defining preprocessor variable包含定义预处理器变量的不同文件
【发布时间】:2021-06-28 21:49:13
【问题描述】:

我看到了使用 -D 编译开关使用不同类的非常好的示例。

但是,在我的用例中,事情有点不同,我不知道该怎么做。

对于多路复用 API,我在 3 个不同的文件中有 3 个类:

poll.h   -> class PollSelector   -> generic poll() works everywhere
epoll.h  -> class EPollSelector  -> Linux only epoll support
kqueue.h -> class KqueueSelector -> MacOS only kqueue

所有 3 个类都有相同的方法,所以我使用:

#include "selector/poll.h"
using MySelector = PollSelector;

我在想,如果有办法可以用-D 开关做到这一点,但同时,如果我添加额外的多路复用类,只能用-D 标志切换它,无需编辑使用它的文件。

我想象它的方式是有这样的命令:

gcc -Dkqueue file.h

这会自动完成

#include "selector/kqueue.h";
using MySelector = kqueue_selector; // I will do this typedef in kqueue.h so it will compile

这可以以干净的方式完成,而不需要在 C 预处理器中“潜水”吗?

这里是源的原始链接
https://github.com/nmmmnu/HM4/tree/master/net/selector

【问题讨论】:

  • 尝试将您的代码包装在 namespace 中(例如,One_class、Two_class...,但请选择更好的名称)。然后#define MY_SELECTOR = One_class。当你使用这个类时,记得添加命名空间:MY_SELECTOR::My_class。然后在你的 makefile 中选择 MY_SELECTOR 任意你喜欢的。我相信这会使用您的想法(或者可能不会)回答您的问题,但我不喜欢这种解决方案。
  • 问题是如何包含文件?
  • 例如#include SELECTOR_HEADER 在源代码中,-DSELECTOR_HEADER="selector/poll.h" 在命令行中。更一般地,#include 指令的参数服从通常的宏扩展。我不确定您所说的“潜水”是什么意思;目前尚不清楚您使用或不认为允许使用的预处理器。
  • 我不明白这个问题。 Can this be done in clean way, without "diving" in C preprocessor? 你究竟想要做什么The way I imaging it is to have command like: gcc -Dkqueue 如果您想要拥有该命令,并且您想要选择带有定义的选择器,那么它可以完成。但是您说(我认为)您 想要 使用宏,然后又说您不想使用 C 预处理器,所以我不明白。请解释一下“潜入 C 预处理器”是什么意思,是不是意味着根本不使用 C 预处理器?

标签: c++ c++11 c-preprocessor


【解决方案1】:
generic poll() works everywhere
Linux only epoll support
MacOS only kqueue

你打算这样做:

#if __LINUX__
#include "selector/kqueue.h"
using MySelector = KqueueSelector;
#elif __OSX__
#include "selector/kqueue.h";
using MySelector = EPollSelector;
#else
#include "selector/poll.h";
using MySelector = PollSelector;
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2011-01-05
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多