【发布时间】: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