2017-03-22 8 views
-1

私のC++コードでは、パブリックヘッダーとプライベートヘッダーがほとんど定義されていません。プライベートヘッダーは、特定の#ifdefに基づいてこれらのパブリックヘッダーのみに含まれることを意図しています。プライベートヘッダーが直接ユーザーに含まれているとコンパイルエラー/警告がスローされる

ユーザーがこれらのプライベートヘッダーを直接含む場合、ユーザーにエラーまたは警告を送信する方法を教えてください。

+1

[Cプリプロセッサでエラーまたは警告を生成するにはどうすればよいですか?](http://stackoverflow.com/questions/2221517/how-do-i-generate-an-error-or-warning- in-the-c-preprocessor) – user3528438

+0

一般的に言えば、ヘッダーがプライベートであることを意図されている場合、最初にエンドユーザーに配信されるべきではありません。ユーザーに配信される場合は、パブリックヘッダーです。 –

+0

プライベートヘッダーを含めることができる条件によっては、ヘッダーに '#if!(condition)#error#endif'を置くことができます。 – 0x5453

答えて

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より良いトークン名を選択します。 2つの__を連続して入力しないでください。または、_で始まり、大文字で始まり標準の制限と競合しないようにしてください。

これにより、間違ってプライベートヘッダーを直接含めることができなくなりますが、パブリックヘッダーを通じて間接的にプライベートヘッダーを含めることはできません。

4

私たちがよくしていることは、別々のフォルダにある別々のパブリックヘッダとプライベートヘッダです。その後、エンド・ユーザーにプライベート・フォルダへのアクセスを許可しないように決めることができます(これを自分に送信しないか、またはコンパイラのインクルード検索パスの一部にしないことによって)。

これは、パブリックヘッダーにプライベートヘッダー(明らかにしたいこと)が含まれていないことが必要です。これは、コードが整理されている場合は常に実行可能でなければなりません。パブリックヘッダーは、プライベートヘッダーで定義されたクラスにはforward declarationsまたはpimpl idiomを使用し、ソースヘッダーにはプライベートヘッダーを含める必要があります。それがなければ、プライベートヘッダーを含むパブリックヘッダーを提供することは意味がありません。人々には含まれないようにしてください。 ...最終的にはパブリックなものを含めるだけですから!!

関連する問題