2017-06-05 7 views
1

私は質問に答えましたhereassertこれは標準でマクロではなく機能として実装されています。実際に何がスタンダードコールであるか

これはassertは、それがパラメータを取る方法で、機能のように見えるような方法ので、私に問題を引き起こしていた:assert(true)このように私はとしてそれを使用しようとしました:std::assert(true)そしてもちろん動作しませんでしたマクロいます。

私の質問は次のとおりです。パラメータを取る関数として現れる標準ライブラリによって提供される他のマクロはありますか?

+3

あなたは、標準のコピーを見つけることができる[ここ](http://www.open-std.org/jtc1/sc22 /wg21/docs/papers/2017/n4659.pdf) - 今すぐ読み始める;-) –

+3

['offsetof'](http://en.cppreference.com/w/cpp/types/offsetof)はそのような典型的な関数の1つですのようなマクロ。他の関数はマクロとしても適切な関数として実装しても構いません(ただし、C関数ではもっと真実ですが、すべてのC++関数は 'std'名前空間になければなりません)。 –

+0

'assert'は' NDEBUG'を定義することでオフにできるので、マクロのような関数として実装されています。 – riodoro1

答えて

3

我々は[ヘッダ]パラグラフ5及び6私たちは

を持って見ればCのマクロとして定義されている名前はCのように、実装のためのライセンスを付与した場合でも、C++標準ライブラリのマクロとして定義されなければなりません機能。 [注:Cでマクロとして定義された名前には、次のものが含まれます。assert,offsetofsetjmpva_argva_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); 
+1

私が思い出しているように、浮動小数点値をテストするための 'isnan'や' isinf'のような ''の関数である ''にはいくつかの関数型マクロがあります。私は ''をC++に含めるのであれば良い実装があなたに(マクロではなく)関数を与えることを期待しますが、誰が知っていますか? –

+0

@AdrianMcCarthyああスナップしています。Cではマクロです:http://en.cppreference.com/w/c/numeric/math/isnanしかし、C++では関数http://en.cppreferenceです。 com/w/cpp/numeric/math/isnan Nathan Oliverがここで満足している要件をどのように満たしているのだろうか? –

+1

@AdrianMcCarthy答えがなぜそれらの機能であるかで更新されました。 – NathanOliver

関連する問題