我問了一個問題here關於assert
它在標準中實現爲宏而不是函數。什麼標準調用實際上是宏
這不得不引起我的問題是因爲assert
似乎是它需要一個參數的方式運作方式:assert(true)
因此我試圖用它作爲:std::assert(true)
,當然是沒有工作的宏。
我的問題是這樣的:標準庫提供的其他宏是否會顯示爲帶參數的函數?
我問了一個問題here關於assert
它在標準中實現爲宏而不是函數。什麼標準調用實際上是宏
這不得不引起我的問題是因爲assert
似乎是它需要一個參數的方式運作方式:assert(true)
因此我試圖用它作爲:std::assert(true)
,當然是沒有工作的宏。
我的問題是這樣的:標準庫提供的其他宏是否會顯示爲帶參數的函數?
如果我們看一下[標題]第5和第6,我們已經被定義爲C宏
名稱應定義爲C宏++標準庫,即使C組贈款許可證執行情況功能。 [注意:在C中定義爲宏的名稱包括以下內容:
assert
,offsetof
,setjmp
,va_arg
,va_end
和va_start
。 - 注意]在C中定義爲函數的名稱應定義爲C++標準庫中的函數。
因此,如果它定義爲C中的宏,它將成爲C++中的宏。雖然有一些例外。從[support.runtime]段7和8
頭
<cstdalign>
和標題<stdalign.h>
不得定義名爲alignas
宏。頭
<cstdbool>
和頭<stdbool.h>
不得定義一個名爲bool
宏,true
,或false
。
雖然這些異常是由[標題]/7以及
標識符作爲關鍵字或C++運營商覆蓋不應被定義爲C++標準庫頭宏。
還有,在7.12.3分類宏定義的所有分類宏每[c.math]功能被重載異常/ 10
分類/比較函數的行爲一樣的C宏,具有在C標準中的7.12.3分類宏和7.12.14宏比較中定義的相應名稱。每個函數重載三個浮點類型,如下所示:
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);
如果我回想起來,'
@AdrianMcCarthy哦,你說得對,在C中它們是宏:http://en.cppreference.com/w/c/numeric/math/isnan,但在C++中它們是函數:http://en.cppreference。 com/w/cpp/numeric/math/isnan我想知道Nathan Oliver引用的要求在這裏得到了滿足嗎? –
@AdrianMcCarthy答案更新爲什麼這些功能。 – NathanOliver
你可以找到標準[這裏](http://www.open-std.org/jtc1/sc22副本/wg21/docs/papers/2017/n4659.pdf) - 現在開始閱讀;-) –
['offsetof'](http://en.cppreference.com/w/cpp/types/offsetof)是一個典型的函數像宏。其他函數可以實現爲宏或適當的函數(儘管對於C函數更爲正確,因爲所有C++函數都必須位於'std'名稱空間中)。 –
以防萬一你想知道,'assert'是作爲像宏這樣的函數實現的,因爲它可以通過定義'NDEBUG'來關閉。 – riodoro1