如何在公共头文件中向库的用户公开枚举,同时在内部使用它?

How do I expose an enum to users of my library in a public header file but also use it internally?

本文关键字:枚举 在内部 文件 用户      更新时间:2023-10-16

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

例如:

公共.h

#include "Internal.h"

namespace PublicFunctions {
enum Access{
READ,
WRITE,
}
FileObject CreateFileObject(Access a) {
return InternalFunctions::GetFileObject(a);
}
}

内部.h

#include "Public.h"

namespace InternalFunctions {
FileObject GetFileObject(PublicFunctions::Access a);
}

内部.cpp

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

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

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

包含守卫无法帮助您,因为如果首先包含 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,这违背了将两者分开的意义。

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

namespace PublicFunctions {
enum Access{
READ,
WRITE,
}
FileObject CreateFileObject(Access a);
}

并留下内部.h。它将由编译的库独占使用,不随公共接口一起提供。

#include "Public.h"
namespace InternalFunctions {
FileObject GetFileObject(PublicFunctions::Access a);
}

,然后是内部.cpp

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

最后是公开的.cpp

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

是否值得将公共.cpp和内部分开.cpp取决于程序员及其编码标准。