我问了ConstraintLayout on iOS关于here的问题,该问题在标准中作为宏实现,而不是函数。
这导致了一个问题,因为assert
在参数采用方式中似乎是一个函数的方式:assert(true)
因此我尝试将其用作:std::assert(true)
和当然是一个无效的宏。
我的问题是:标准库提供的其他宏是否会显示为带参数的函数?
答案 0 :(得分:3)
如果我们查看[标题]第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
的宏。
虽然[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);