2017-06-05 35 views
1

我問了一個問題here關於assert它在標準中實現爲宏而不是函數。什麼標準調用實際上是宏

這不得不引起我的問​​題是因爲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)是一個典型的函數像宏。其他函數可以實現爲宏或適當的函數(儘管對於C函數更爲正確,因爲所有C++函數都必須位於'std'名稱空間中)。 –

+0

以防萬一你想知道,'assert'是作爲像宏這樣的函數實現的,因爲它可以通過定義'NDEBUG'來關閉。 – riodoro1

回答

3

如果我們看一下[標題]第5和第6,我們已經被定義爲C宏

名稱應定義爲C宏++標準庫,即使C組贈款許可證執行情況功能。 [注意:在C中定義爲宏的名稱包括以下內容:assert,offsetof,setjmp,va_arg,va_endva_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); 
+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

相關問題