gpt4 book ai didi

c++ - Dynamic#include 基于宏定义

转载 作者:可可西里 更新时间:2023-11-01 18:35:53 26 4
gpt4 key购买 nike

我正在编写一个 C++ 应用程序,我想让开发人员在编译时选择针对特定问题使用的算法。这两种算法都是作为实现公共(public)接口(interface)的 C++ 类实现的,并且是彼此的直接替换。它们都有一个 .h 和一个 .cpp 文件,并位于一个子目录中(我们称之为 impl/ )。

在我的 Makefile 中,我有类似这样的内容:

...
IMPL = default
...
binary: ... impl/$(IMPL).o
...
impl/%.o: impl/%.cpp impl-interface.h impl/%.h
...
%o: %.cpp ...
$(CXX) $(CXXFLAGS) -DIMPL=$(IMPL) -c -o $@ $*.cpp

这个想法是用户应该能够输入 make binary IMPL=thatimpl .

在任何想要使用用户选择的算法的文件中,我都会这样做:

IImpl o = new IMPL();

但是,这需要我包含所选实现的头文件。不幸的是,C++ 需要 #include后面跟一个 "string" , 一个 <libfile> .您也可以按照建议使用宏 here ,但它要求宏的参数是文字字符串。如果我使用:

#define QUOTEME(M)       #M
#define INCLUDE_FILE(M) QUOTEME(impl/##M##.h)
#include INCLUDE_FILE(IMPL)

编译器将尝试包含文字字符串 impl/IMPL.h , 而不是扩展 IMPL传递给 make 的任何内容然后到编译器。

非常欢迎任何关于我如何实现这一目标的指示!

最佳答案

由于预处理器的工作方式,您只需要添加一个额外的间接层。这应该做:

#define QUOTEME(x) QUOTEME_1(x)
#define QUOTEME_1(x) #x
#define INCLUDE_FILE(x) QUOTEME(impl/x.h)

#include INCLUDE_FILE(IMPL)

Live example

关于c++ - Dynamic#include 基于宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com