我正在编写一个C应用程序,我想让开发人员在编译时选择用于特定问题的算法.两种算法都实现为实现公共接口的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的任何内容,然后再扩展到编译器.
关于如何实现这一目标的任何指示都将非常受欢迎!
解决方法
原文地址:https://www.jb51.cc/c/119112.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。