这是合法的C/C++吗?`int*p =(int []){1,2,3};`

Ton*_*nyK 9 c c++ arrays standards literals

我的这个答案产生了一些评论,声称以下构造不是合法的C/C++:

void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
Run Code Online (Sandbox Code Playgroud)

(请参阅完整程序的ideone链接).但我们无法解决这个问题.任何人都可以对此有所了解吗?各种标准有什么用?

Mat*_*Mat 9

据我所知,这是有效的C99 - 这是通过复合文字.

C99标准以此为例(§6.5.2.5/ 9):

示例1文件范围定义

int *p = (int []){2, 4};
Run Code Online (Sandbox Code Playgroud)

初始化p指向两个整数数组的第一个元素,第一个元素的值为2,第二个元素的值为4.此复合文字中的表达式必须是常量.未命名的对象具有静态存储持续时间.

请注意,这里的(int [])东西不是演员.

这不是一个有效的C++构造,复合文字不是C++标准的一部分(包括C++ 11).一些编译器允许它作为扩展.(GCC确实如此,通过它-Wall -pedantic来获取有关它的诊断信息.IBM xlC也允许它作为扩展.)

  • 请注意,只有数组对象位于文件范围时才具有静态存储持续时间,如示例所示.如果它出现在函数定义中,那么它具有与封闭块相关联的自动存储持续时间(即,当执行到达封闭的`}时,对象和指向它的任何指针都变为无效.这与字符串文字不同,字符串文字总是具有静态存储持续时间. (2认同)