作者:happy可乐可爱多_376_874 | 来源:互联网 | 2023-01-27 07:09
这一点在父节小节7.20.4中有所涉及.
在您引用的部分中:
宏UINTN_C(value)
应扩展为与类型对应的整数常量表达式uint_leastN_t
.
它说" 对应于 ",而不是扩展实际上是那种类型." 对应于 " 的含义在7.20.4p3中解释:
其中一个宏的每次调用都应扩展为适合在#if
预处理指令中使用的整数常量表达式.表达式的类型应与根据整数提升转换的相应类型的表达式具有相同的类型.表达式的值应该是参数的值.
由于宏旨在用于#if
指令,因此它们不能使用强制转换(预处理器不理解强制转换或类型名称).
在实践中,这样的常量表达式几乎总是被隐式转换为适当的类型,因此其实际类型与您可能期望的不同的事实通常不是问题.
至于uint_leastN_t
在7.20.4p2中,在子部分中也包含的范围之外的值:
这些宏的任何实例中的参数都应是未填充的整数常量(如6.4.4.1中所定义),其值不超过相应类型的限制.
这是约束之外的"必须",因此违反它会导致未定义的行为.不要那样做.
(在阅读C标准时,通常最好检查一下家长小节的措辞,这些措辞可能会澄清或覆盖您正在阅读的内容.我自己也被这个问题所困扰.)
1> Keith Thomps..:
这一点在父节小节7.20.4中有所涉及.
在您引用的部分中:
宏UINTN_C(value)
应扩展为与类型对应的整数常量表达式uint_leastN_t
.
它说" 对应于 ",而不是扩展实际上是那种类型." 对应于 " 的含义在7.20.4p3中解释:
其中一个宏的每次调用都应扩展为适合在#if
预处理指令中使用的整数常量表达式.表达式的类型应与根据整数提升转换的相应类型的表达式具有相同的类型.表达式的值应该是参数的值.
由于宏旨在用于#if
指令,因此它们不能使用强制转换(预处理器不理解强制转换或类型名称).
在实践中,这样的常量表达式几乎总是被隐式转换为适当的类型,因此其实际类型与您可能期望的不同的事实通常不是问题.
至于uint_leastN_t
在7.20.4p2中,在子部分中也包含的范围之外的值:
这些宏的任何实例中的参数都应是未填充的整数常量(如6.4.4.1中所定义),其值不超过相应类型的限制.
这是约束之外的"必须",因此违反它会导致未定义的行为.不要那样做.
(在阅读C标准时,通常最好检查一下家长小节的措辞,这些措辞可能会澄清或覆盖您正在阅读的内容.我自己也被这个问题所困扰.)