在我的c ++代码中,我定义了一些公共和私有标头。私有标头仅包含在基于某些#ifdefs的这些公共标头中。
如果用户直接包含这些私有标题,如何向用户抛出错误或警告?
答案 0 :(得分:4)
在公共标题中定义一些标记。
在公开标题的末尾清除它。
在私人标题中对其进行测试。
用户仍然可以绕过它,但无法通过简单的#include
绕过它。
产生的警告或错误应说明他们做了什么,以及应该做些什么。
公共标题:
#pragma once
#define IN_MY_PUBLIC_HEADER_OH_WOW
#include "private_header.h"
#undef IN_MY_PUBLIC_HEADER_OH_WOW
私人标题:
#pragma once
#ifndef IN_MY_PUBLIC_HEADER_OH_WOW
#error __FILE__ should only be included via the public headers, never directly in your code
#endif
选择比IN_MY_PUBLIC_HEADER_OH_WOW
更好的令牌名称。不要连续包含两个__
,或者以_
开头,后跟大写字母,以避免与标准中的限制冲突。
这可以防止您意外地直接包含私有标头,但仍允许您通过公共标头间接包含它。
答案 1 :(得分:4)
我们通常做的是在不同文件夹中分隔公共和私有标头。然后,您可以决定不将最终用户访问私有文件夹(通过不将其发送给他或不使其成为编译器包含搜索路径的一部分)。
这要求公共标头不包含私有标头(您显然想要这样做)。如果代码组织良好,这应始终是可行的:对于在私有标头中定义的类,公共标头应使用forward declarations或pimpl idiom,并且只有源文件应包含私有标头。如果没有这个,提供包含您不希望人们加入的私有标题的公共标题是没有意义的,因为它们最终只会包含公共标题!!