如果我正在创建一个公开一个公共头文件的库,它可能会接受或返回一个公开公开的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
曾经是解决这些依赖关系的最佳方法?
包含保护无法帮助您,因为如果首先包含 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] 删除。
我来说两句