在C语言中是否可以使用匿名的特殊数组?
是否可以在C中创建匿名的特殊数组 例如,假设我有一个名为在C语言中是否可以使用匿名的特殊数组?,c,arrays,C,Arrays,是否可以在C中创建匿名的特殊数组 例如,假设我有一个名为processArray(int[]array)的函数,它以int数组作为参数,我可以用以下方式向它传递一个匿名数组: int main(){ processArray( (int[]){0, 1, 2, 3} ); //can I create this type of array? return 0; } 或者我必须先声明数组(使用指针),然后将其指针传递给processArray()?例如: int main(){ int[]
processArray(int[]array)
的函数,它以int数组作为参数,我可以用以下方式向它传递一个匿名数组:
int main(){
processArray( (int[]){0, 1, 2, 3} ); //can I create this type of array?
return 0;
}
或者我必须先声明数组(使用指针),然后将其指针传递给processArray()?例如:
int main(){
int[] myArray = {0, 1, 2, 3};
processArray(myArray);
return 0;
}
使用C99和C11,您可以编写您编写的内容,如以下代码所示。这些是ISO/IEC 9899:2011中描述的“复合文字”(与ISO/IEC 9899:1999中的章节相同)
检查这个问题,这是一个重复的问答关于C++,而不是C/同意米迦勒-它不是一个复制品;C和C++是不同的语言,而这个特殊的例子是一个只强调差异的例子!代码>int[]myArray?这不是C#,必须是
int myArray[]
。请注意,对于宏,您甚至可以消除额外的size参数:#define processArray(a)processArray_func(sizeof(a)/sizeof*(a)、(a))
,但在宏参数中,您需要在复合文本周围加上一组括号,以防止预处理器使用逗号…除非您使用了一个非常难看的hack with\uuuu VA\u ARGS\uuuu
:-)我提到这一点的部分原因是,有些人认为这种设计是可变函数的现代替代品。使用可变宏和复合文本,您可以使调用约定看起来完全像可变函数,但它的结构要复杂得多(例如,以编程方式生成参数列表的能力、某些类型检查能力等),尽管您可以使用宏(可能还有varargs,但正如您所说,它会变得混乱),而且它避免了多次写出文字,在数组末尾使用sentinel值(例如负整数)可能会做得更好。事实上,这也是一种很好的方法。上周我遇到了一个有趣的稍微相关的问题<代码>#定义SNBUFF(s)、sizeof(s),然后使用如下命令:snprintf(SNBUFF(固定数组),“%s(%s)=%d\n”、xxx、yyy、zzz)代码>。看起来应该没问题;除非snprintf()
是宏,否则它是正常的。然后SNBUFF()。在Mac OS X 10.7.5上,在包含的头文件security/\u stdio.h
中有一个通过定义的snprintf()宏,如:\define snprintf(str,len,…)\uuuuuuuuuuu内置的snprintf\uchk(str,len,0,\uuuuuuuu darwin\u obsz(str),\uuuuu VA\uu ARGS)
。解决办法是失去SNBUFF。
#include <stdio.h>
static void processArray(int n, int arr[])
{
for (int i = 0; i < n; i++)
printf(" %d", arr[i]);
putchar('\n');
}
int main(void)
{
processArray(4, (int[]){0, 1, 2, 3});
return 0;
}
0 1 2 3