我有一组松散相关的头文件库,我想让它们在不紧密耦合的情况下协同工作。我想到的一种方法是尝试包含其他头文件,如果找到它们,那么我可以相应地生成代码。所以也许我会在 vector.hh 中有一个 vector 类:
#ifndef __VECTOR_HH__
#define __VECTOR_HH__
bunch of vector-y stuff
#endif
然后在另一个文件 coordinates.hh 中(假设它进行坐标转换):
#ifndef __COORDINATES_HH__
#define __COORDINATES_HH__
#include <vector.hh>
class SomeCoordinateType {
#ifdef __VECTOR_HH__
operator vector() { <convert to vector> }
#endif
}
#endif
用户获取他们需要的任何头文件的想法。如果他们获取了 vector.hh header 和 coordinates.hh,那么我将为他们创建转换运算符,否则我不会创建。这一切都取决于能否让 #include 指令在失败时不产生 fatal error 。有什么办法吗?
最佳答案
一种典型的方法是使用一个小型配置工具来生成自定义“config.h”(显然使用您认为合适的名称),其中仅包含他们选择的配置所需的其他 header 。
另一种可能性是让 config.h 有条件地包含其他 header ,并让您的配置工具生成合适的 makefile,通过定义(或不定义)控制这些包含的宏来启用功能。通常,您将有一个定义实际依赖项的主生成文件,并且只生成一个小文件以包含类似以下内容的行:
特征 = -DCOORDS -DVECTOR
CFLAGS = $(特征)-O2
...然后将其包含到您的主生成文件中以获取在编译期间定义的那些值,从而启用依赖于它们的功能。然后在你的标题中,你会有类似的东西:
// coordinates.h
#ifdef VECTOR
#include <vector>
#endif
// ...
class coordinate {
#ifdef VECTOR
operator vector() { /* ... */ }
#endif
};
但是,我会努力避免让你的代码到处都是 #ifdef
,尤其是嵌套到需要长时间仔 segmentation 析才能弄清楚类具有哪些功能的程度任何给定的特征组合是否被定义。
关于c++ - 是否有可能 #include 失败而不中止编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592961/