如果用户直接包含私有标头,则抛出编译错误/警告

时间:2017-03-22 18:02:29

标签: c++ c++11 boost

在我的c ++代码中,我定义了一些公共和私有标头。私有标头仅包含在基于某些#ifdefs的这些公共标头中。

如果用户直接包含这些私有标题,如何向用户抛出错误或警告?

2 个答案:

答案 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 declarationspimpl idiom,并且只有源文件应包含私有标头。如果没有这个,提供包含您不希望人们加入的私有标题的公共标题是没有意义的,因为它们最终只会包含公共标题!!