什么标准调用实际上是宏

时间:2017-06-05 13:05:33

标签: c++ parameters macros namespaces assert

我问了ConstraintLayout on iOS关于here的问题,该问题在标准中作为宏实现,而不是函数。

这导致了一个问题,因为assert在参数采用方式中似乎是一个函数的方式:assert(true)因此我尝试将其用作:std::assert(true)和当然是一个无效的宏。

我的问题是:标准库提供的其他宏是否会显示为带参数的函数?

1 个答案:

答案 0 :(得分:3)

如果我们查看[标题]第5和第6段,我们有

  

在C语言库中定义为宏的名称应在C ++标准库中定义为宏,即使C授予实现许可证作为函数。 [注意:在C中定义为宏的名称包括以下内容:assertoffsetofsetjmpva_argva_endva_start 。 - 后注]

     

在C中定义为函数的名称应定义为C ++标准库中的函数。

因此,如果它被定义为C中的宏,它将是C ++中的一个宏。但有几个例外。来自[support.runtime]第7和第8段

  

标题<cstdalign>和标题<stdalign.h>不得定义名为alignas的宏。

     

标题<cstdbool>和标题<stdbool.h>不得定义名为booltruefalse的宏。

虽然[headers] / 7也涵盖了这些例外

  

C ++中作为关键字或运算符的标识符不应在C ++标准库头中定义为宏。

还有一个例外,即7.12.3分类宏中定义的所有分类宏都会被函数重载[c.math] / 10

  

分类/比较函数的行为与C宏相同,其中相应的名称在7.1标准中的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);