ヘッダーファイルは、C と C++ プログラムの両方にインクルードできるようにしなければならない場合があります。しかし、従来型の C としても知られる「Kernighan and Ritchie C」(K&R C)、ANSI C (日本語版は 『注解 C++ リファレンスマニュアル』) の C++ (ARM C++)、および ISO C++ は、1 つのヘッダーファイル内の同じプログラム要素に対して異なる宣言や定義を規定している場合があります (言語およびバージョンによる違いの詳細は『C++ 移行ガイド』を参照)。これらの標準のすべてに受け入れられるようにヘッダーファイルを設定するには、プリプロセッサマクロの __STDC__ と __cplusplus が存在するかどうか、また、存在する場合はその値が何であるかに応じて、条件付きコンパイルを使用しなければならない場合があります。
マクロ __STDC__ は、K&R C では定義されていませんが、ANSI C と C++ では定義されています。このマクロは、K&R C コードを ANSI C または C++ のコードと分ける際に使用してください。このマクロは、プロトタイプ宣言された関数定義とプロトタイプ宣言されていない関数定義を分けるのに最も便利です。
#ifdef _ _STDC_ _ int function(char*,...); // C++ および ANSI C の宣言 #else int function(); // K&R C #endif
マクロ __cplusplus は C では定義されていませんが、C++ では定義されています。
C++ の初期のバージョンでは、マクロ __cplusplus ではなく c_plusplus が定義されていました。マクロ c_plusplus は、現在は定義されていません。
__cplusplus の定義は、C と C++ を分ける際に使用してください。このマクロは、次の例に示すように関数宣言に対する extern "C" インタフェースの指定を保護するのに最適です。extern "C" の指定の矛盾を防ぐため、extern "C" リンケージ指定のスコープ内には #include 指令を入れないでください。
#include“header.h” //... 他のインクルードファイル ... #if defined(_ _cplusplus extern“C”{ #endif int g1(); int g2(); int g3() #if defined(_ _cplusplus) } #endif
ARM C++ では、__cplusplus マクロの値は 1 です。ISO C++ では、このマクロの値は 199711L (この規格が制定された年月を long 定数として表現したもの) です。このマクロの値は、ARM C++ を ISO C++ と分ける際に使用してください。このマクロの値は、テンプレート構文内の変更を保護するのに最適です。
// テンプレート関数の特殊化 #if _ _cplusplus < 199711L int power(int,int); // ARM C++ #else template <> int power(int,int); // ISO C++ #endif