[英]Is variably-modified type a VLA only?
一个简单的问题:可变修改类型仅是 VLA(可变长度数组)吗?
C11,6.10.8.3 条件特征宏,1(添加了重点):
__STDC_NO_VLA__
integer 常量1
,意在表明实现不支持可变长度 arrays或可变修改类型。
这是否意味着除了 VLA 之外还有一个可变修改类型? 有什么例子吗?
“可变修改类型”和“可变长度数组”之间有什么关系?
额外:“可变长度数组”的定义取决于“已知常量大小”的定义:
如果 size 是一个 integer 常量表达式并且元素类型有一个已知的常量 size ,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。
但是,“已知常量大小”的定义取决于“可变长度数组”的定义:
如果类型不是不完整的并且不是可变长度数组类型,则该类型具有已知的常量大小。
有点困惑。
相关DR: http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_312.htm 。
这是否意味着除了 VLA 之外还有一个可变修改类型? 有什么例子吗?
根据C标准(6.7.6声明符)
3 完整声明符是不属于另一个声明符的声明符。 如果在完整声明符的声明符嵌套序列中,有一个声明符指定可变长度数组类型,则称由完整声明符指定的类型被可变修改。 此外,通过声明符类型派生自可变修改类型的任何类型本身都是可变修改的。
这是一个演示程序
#include <stdio.h>
int main( void )
{
for ( size_t n = 1; n < 10; n++ )
{
typedef int ( *Ptr )[n];
Ptr p;
printf( "sizeof( *p ) = %zu\n", sizeof( *p ) );
}
}
程序 output 是
sizeof( *p ) = 4
sizeof( *p ) = 8
sizeof( *p ) = 12
sizeof( *p ) = 16
sizeof( *p ) = 20
sizeof( *p ) = 24
sizeof( *p ) = 28
sizeof( *p ) = 32
sizeof( *p ) = 36
在这个程序中,像int( * )[n]
这样定义的指针类型Ptr
是一个可变修改类型。
这个报价
如果类型不是不完整的并且不是可变长度数组类型,则该类型具有已知的常量大小。
意味着此类类型的sizeof
运算符在编译时求值,与可变长度数组类型在运行时求值相反,并且此类类型的大小在程序执行期间不会更改。
引用与下面的引用有不同的含义
如果大小是 integer 常量表达式并且元素类型具有已知常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。
这说明了如何区分可变长度数组的声明和非可变长度数组的声明。
C 2018 6.7.6 3 说:
如果在完整声明符的嵌套声明符序列中,有一个声明符指定可变长度数组类型,则称由完整声明符指定的类型是可变修改的。 此外,通过声明符类型派生自可变修改类型的任何类型本身都是可变修改的。
因此int (*)[n]
,对于某些非常量n
,即使它是一个指针,也是一个可变修改的类型。 此外, int [3][n]
是可变修改类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.