Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中是否可以使用匿名的特殊数组?_C_Arrays - Fatal编程技术网

在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[]

是否可以在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[] 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