【问题标题】:Throw compile error/warning if private headers included directly by users [closed]如果用户直接包含私有标头,则引发编译错误/警告[关闭]
【发布时间】:2017-03-22 18:02:28
【问题描述】:

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

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

【问题讨论】:

  • 一般来说 - 如果标头是私有的,则不应首先将其传递给最终用户。如果它被传递给用户 - 它是一个公共标头。
  • 根据允许包含私有标头的条件,您可以在标头中添加#if !(condition) #error #endif
  • 不应该关闭,这实际上并不是所提到问题的重复,@jpo38 的回答提出了一个有效的观点,并为其他想尝试这个的人提供了指导

标签: c++ c++11 boost


【解决方案1】:

在您的公共标头中定义一些令牌。

在公共标题的末尾清除它。

在您的私有标头中测试它。

用户仍然可以绕过它,但不能通过简单的#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 更好的令牌名称。不要连续包含两个__,或以_ 开头后跟大写字母,以免与标准中的限制冲突。

这可以防止您意外直接包含私有标头,但仍允许您通过公共标头间接包含它。

【讨论】:

    【解决方案2】:

    我们通常做的是在不同的文件夹中分开公共和私有标题。然后,您可以决定不授予最终用户对私有文件夹的访问权限(不将其发送给他或不使其成为编译器包含搜索路径的一部分)。

    这要求公共标头不包含私有标头(您显然想要做的)。如果代码组织良好,这应该总是可行的:公共头文件应该使用forward declarationspimpl idiom 用于私有头文件中定义的类,并且只有源文件应该包含私有头文件。没有它,提供包含您不希望人们包含的私有标头的公共标头是没有意义的...因为他们最终会通过包含公共标头来包含它们!

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2016-12-13
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多