是否可能有#include失败而不是中止编译?

gct*_*gct 2 c c++

我有一组松散相关的头库,我想让它们一起工作,而不是紧密耦合.我想到这样做的一种方法是尝试包含其他头文件,如果找到它们,那么我可以相应地生成代码.所以也许我会在vector.hh中有一个vector类:

#ifndef __VECTOR_HH__
#define __VECTOR_HH__

bunch of vector-y stuff

#endif
Run Code Online (Sandbox Code Playgroud)

然后在另一个文件coordinates.hh(让我们说它确实协调转换):

#ifndef __COORDINATES_HH__
#define __COORDINATES_HH__
#include <vector.hh>

class SomeCoordinateType {
#ifdef __VECTOR_HH__
    operator vector() { <convert to vector> }
#endif
}

#endif
Run Code Online (Sandbox Code Playgroud)

用户的想法是抓取他们需要的任何头文件.如果他们抓住了vector.hh标头以及coordinates.hh,那么我将为它们创建转换运算符,如果不是的话.这一切都取决于能否使#include指令在失败时不会产生致命错误.有没有办法做到这一点?

Jer*_*fin 7

一种典型的方法是使用一个小的配置工具生成一个自定义的"config.h"(显然使用您认为合适的名称),它只包含他们选择的配置所需的其他标头.

另一种可能性是让config.h有条件地包含其他头文件,并让配置工具生成一个合适的makefile,通过定义(或不​​定义)控制这些包含的宏来启用功能.通常,您将拥有一个定义实际依赖项的主makefile,并生成一个小文件以包含类似于以下内容的行:

特点= -DCOORDS -DVECTOR

CFLAGS = $(FEATURES)-O2

...然后将其包含在主makefile中以获取编译期间定义的值,从而启用依赖于它们的功能.然后在你的标题中,你会有类似的东西:

// coordinates.h
#ifdef VECTOR
#include <vector>
#endif

// ...
class coordinate {
   #ifdef VECTOR
       operator vector() { /* ... */ }
   #endif
};
Run Code Online (Sandbox Code Playgroud)

但是,我会努力避免让你的代码充满#ifdef无处不在,特别是嵌套到需要花费很长时间并仔细分析以确定类对于任何给定的特定组合定义与否的特征.