web-dev-qa-db-ja.com

Cコード( 'extern C'が必要)がC ++でコンパイルされているかどうかを検出する方法

C++ライブラリの一部としてCヘッダーがあります。

このCヘッダーは、Cコンパイラーまたはextern "C" { ... }ブロック内のC++コンパイラーによってコンパイルされた場合にのみ意味があり、そうでない場合、未解決のリンクエラーが発生します。

私は次のようなブロックを追加しようと思いました:

#ifdef __cplusplus
#error "Compiling C bindings with C++ (forgot 'extern \"C\"'?)"
#endif

cヘッダーでは、残念ながら__cplusplusマクロはextern "C" { ... }ブロック内でも定義されています。

この状態を正しく検出する別の方法はありますか?

46
fferri

一般的な方法は、クライアントコードがヘッダーをextern "C"でラップすることを要求するのではなく、条件付きで自分でラップすることです。例えば:

#ifdef __cplusplus
extern "C" {
#endif

  // Header content

#ifdef __cplusplus
}
#endif

これにより、ヘッダーを含める以外に何もすることなく、クライアントコードが自動的に修正されます。