13

重複の可能性:
C ソース ファイルが C++ コードとしてコンパイルされているかどうかを (プリプロセッサ経由で) チェックする方法

ヘッダー ファイルが C または C++ としてコンパイルされているかどうかをテストする標準マクロを見つけようとしています。これの目的は、ヘッダーが C または C++ コードのいずれかによってインクルードされる可能性があり、どちらに応じてわずかに異なる動作をする必要があるかということです。具体的には:

C では、これをコードにする必要があります。

extern size_t insert (const char*);

C++ では、これをコードにする必要があります。

extern "C" size_t insert (const char*);

さらに、ヘッダー内のすべての宣言の周りに #ifdef を配置しないようにする方法はありますか?

4

3 に答える 3

27

C++ プログラムで使用できるように、C ヘッダー ファイルを次のようにブラケットするのが通常です。stdio.h などのシステム ヘッダー ファイルを確認すると、おそらく次のように表示されます。

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif
于 2012-09-22T23:54:48.253 に答える
15

答えは、マクロ __cplusplus を使用することです。この場合、最も簡単な方法は次のとおりです。

extern
#ifdef __cplusplus
"C"
#endif
size_t insert (const char*);

このマクロは、C++ 標準の一部です。

于 2012-09-22T23:24:41.507 に答える
7

これを支援するために、次の 3 つのマクロを定義するのが合理的であると思われるかもしれません。

#ifdef __cplusplus
#define EXTERN_C_BEGIN extern "C" {
#define EXTERN_C_END   }
#define EXTERN_C       extern "C"
#else
#define EXTERN_C_BEGIN /* Nothing */
#define EXTERN_C_END   /* Nothing */
#define EXTERN_C       extern /* Or Nothing */
#endif /* __cplusplus */

これは、プロジェクトのほとんどの場所に含まれる標準ヘッダーで最も役立ちます。単一の関数の場合、次のように記述できます。

EXTERN_C size_t insert(const char *name);

関数のグループについては、次のように記述できます。

EXTERN_C_BEGIN

size_t other_insert(const char *name);
size_t other_delete(const char *name);
size_t other_update(const char *old_name, const char *new_name);

EXTERN_C_END

toブロックextern内の個々の関数の前に含めることができます。EXTERN_C_BEGINEXTERN_C_END

于 2012-09-23T06:48:38.360 に答える