如何在公共头文件中向我的库的用户公开枚举但也在内部使用它?

凯伦·卡特尔多

如果我正在创建一个公开一个公共头文件的库,它可能会接受或返回一个公开公开的enum,我将如何在enum内部使用它而不在头文件中创建循环依赖?

例如 :

公共.h

#include "Internal.h"


namespace PublicFunctions {
    enum Access{
        READ,
        WRITE,
    }

    FileObject CreateFileObject(Access a) {
        return InternalFunctions::GetFileObject(a);
    }
}

内部文件

#include "Public.h"


namespace InternalFunctions {

    FileObject GetFileObject(PublicFunctions::Access a);
}

内部文件

FileObject InternalFunctions::GetFileObject(PublicFunctions::Access a) {
    if (a == PublicFunctions::Read) {
          return openreadonly();
    }
    else {
              return openwrite();
    }
}

我知道#praga曾经的预处理器指令,但是有什么方法可以enum在这些内部文件中转发声明吗?

或者#pragma曾经是解决这些依赖关系的最佳方法?

用户4581301

包含保护无法帮助您,因为如果首先包含 public.h,这是图书馆客户的逻辑情况,您最终会得到

// public.h already included so #include "Public.h" is ignored 
namespace InternalFunctions {

    FileObject GetFileObject(PublicFunctions::Access a);
    // PublicFunctions::Access not defined yet.
}

namespace PublicFunctions {
    enum Access{
        READ,
        WRITE,
    }

    FileObject CreateFileObject(Access a) {
        return InternalFunctions::GetFileObject(a);
    }
}

更糟糕的是,任何包含 public.h 的人都可以窥视 internals.h,这违背了将两者分开的意义。

但是如果你CreateFileObject从 public.h 中删除的实现,你可以

namespace PublicFunctions {
    enum Access{
        READ,
        WRITE,
    }

    FileObject CreateFileObject(Access a);
}

并留下 internal.h 。它将被编译库独占使用,不会随公共接口一起提供。

#include "Public.h"

namespace InternalFunctions {

    FileObject GetFileObject(PublicFunctions::Access a);
}

然后Internal.cpp

#include "internal.h"
FileObject InternalFunctions::GetFileObject(PublicFunctions::Access a) {
    if (a == PublicFunctions::Read) {
          return openreadonly();
    }
    else {
              return openwrite();
    }
}

最后是 public.cpp

#include "internal.h"
FileObject PublicFunctions::CreateFileObject(Access a) {
        return InternalFunctions::GetFileObject(a);
    }

是否值得分离 public.cpp 和 internal.cpp 取决于程序员及其编码标准。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章