我々は[ヘッダ]パラグラフ5及び6私たちは
を持って見ればCのマクロとして定義されている名前はCのように、実装のためのライセンスを付与した場合でも、C++標準ライブラリのマクロとして定義されなければなりません機能。 [注:Cでマクロとして定義された名前には、次のものが含まれます。assert
,offsetof
、setjmp
、va_arg
、va_end
、およびva_start
。 -end note]
Cで関数として定義されている名前は、C++標準ライブラリの関数として定義されます。
したがって、Cでマクロとして定義されている場合は、C++でマクロになります。しかし、いくつかの例外があります。 【support.runtime]段落7,8
ヘッダ<cstdalign>
とalignas
という名前のマクロを定義していなければならないヘッダ<stdalign.h>
から。
ヘッダ<cstdbool>
とbool
名前マクロを定義してはならないヘッダ<stdbool.h>
、true
、又はfalse
。
これらの例外は、C++のキーワードや演算子である識別子は、C++標準ライブラリのヘッダー内のマクロとして定義されてはならないだけでなく、[ヘッダ]/7
で覆われていることが、。
7.12.3分類マクロで定義されたすべての分類マクロを分類/比較関数と同じように動作[c.math]/10
当たり関数によってオーバーロードすることを除いもあります7.12.3、分類マクロで定義された対応する名前を持つCマクロ、および7.12.14、C標準の比較マクロ次のように各機能は、3つの浮動小数点型のため、オーバーロードされます。
int fpclassify(float x);
bool isfinite(float x);
bool isinf(float x);
bool isnan(float x);
bool isnormal(float x);
bool signbit(float x);
bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);
int fpclassify(double x);
bool isfinite(double x);
bool isinf(double x);
bool isnan(double x);
bool isnormal(double x);
bool signbit(double x);
bool isgreater(double x, double y);
bool isgreaterequal(double x, double y);
bool isless(double x, double y);
bool islessequal(double x, double y);
bool islessgreater(double x, double y);
bool isunordered(double x, double y);
int fpclassify(long double x);
bool isfinite(long double x);
bool isinf(long double x);
bool isnan(long double x);
bool isnormal(long double x);
bool signbit(long double x);
bool isgreater(long double x, long double y);
bool isgreaterequal(long double x, long double y);
bool isless(long double x, long double y);
bool islessequal(long double x, long double y);
bool islessgreater(long double x, long double y);
bool isunordered(long double x, long double y);
あなたは、標準のコピーを見つけることができる[ここ](http://www.open-std.org/jtc1/sc22 /wg21/docs/papers/2017/n4659.pdf) - 今すぐ読み始める;-) –
['offsetof'](http://en.cppreference.com/w/cpp/types/offsetof)はそのような典型的な関数の1つですのようなマクロ。他の関数はマクロとしても適切な関数として実装しても構いません(ただし、C関数ではもっと真実ですが、すべてのC++関数は 'std'名前空間になければなりません)。 –
'assert'は' NDEBUG'を定義することでオフにできるので、マクロのような関数として実装されています。 – riodoro1