一个简单的问题:可变修改的类型是否仅为VLA (可变长度数组)?
C11,6.10.8.3条件特性宏,1(重点添加):
__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改的类型。
这是否意味着除了VLA之外,还有一种可变的修改类型?有什么例子吗?
“可变修改类型”和“可变长度数组”之间的关系是什么?
额外:“可变长度数组”的定义取决于“已知常量大小”的定义:
如果大小是整数常量表达式,且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。
然而,“已知常量大小”的定义取决于“可变长度数组”的定义:
A类型具有已知的常量,如果该类型不是不完整的,并且不是可变长度数组类型。
有点困惑。
相关博士:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_312.htm。
发布于 2022-03-30 22:56:56
是否意味着除了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 ) );
}
}程序输出是
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在这个程序中,指针类型Ptr定义为int( * )[n],是一个可变修改的类型。
这句话
如果类型不是不完整且不是可变长度数组类型,则
A类型已知常量大小。
这意味着这些类型的sizeof操作符是在编译时计算的,与运行时对可变长度数组类型的计算相反,并且在程序执行过程中这类类型的大小不会改变。
与下面的引文相比,引文有不同的含义
如果大小是整数常量表达式,且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。
这说明了如何区分可变长度数组的声明和非可变长度数组的声明。
发布于 2022-03-30 22:59:44
C 2018年6.7.6 3说:
如果在完整声明器中的声明器嵌套序列中存在指定可变长度数组类型的声明器,则称完全声明器指定的类型是可变修改的。此外,从可变修改类型派生的声明器类型派生的任何类型本身也是可变修改的。
因此,对于某些非常量的int (*)[n],即使它是一个指针,它也是一个可变的修改类型。此外,int [3][n]是一种可变的修改类型。
https://stackoverflow.com/questions/71684881
复制相似问题