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

Pno*_*tNP -1 c++ boost c++11

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

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

Yak*_*ont 5

在公共标头中定义一些标记。

在公共标头末尾清除它。

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

用户仍然可以绕过它,但不能通过简单的#include.

生成的警告或错误应说明他们做了什么,以及他们应该做什么。

公共标头:

 #pragma once
 #define IN_MY_PUBLIC_HEADER_OH_WOW

 #include "private_header.h"

 #undef IN_MY_PUBLIC_HEADER_OH_WOW
Run Code Online (Sandbox Code Playgroud)

私有标头:

 #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
Run Code Online (Sandbox Code Playgroud)

选择一个比 更好的令牌名称IN_MY_PUBLIC_HEADER_OH_WOW。请勿__连续包含两个,或_以大写字母开头,以避免与标准中的限制发生冲突。

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