是否可以在C中使用匿名的ad-hoc数组?

raf*_*afi 18 c arrays

是否可以在C中创建匿名的ad-hoc数组?

例如,假设我有一个调用的函数processArray(int[] array),它接受一个int数组作为参数,我可以通过以下方式传递一个匿名数组:

int main(){
 processArray( (int[]){0, 1, 2, 3} ); //can I create this type of array?
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者我是否必须先声明数组(使用指针),然后将其指针传递给processArray()?例如:

int main(){
 int[] myArray = {0, 1, 2, 3};
 processArray(myArray);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 24

使用C99和C11,您可以编写您编写的内容,如以下代码所示.这些是"复合文字",在ISO/IEC 9899:2011§6.5.2.5复合文字中描述(它与ISO/IEC 9899:1999中的相同部分).

#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;
}
Run Code Online (Sandbox Code Playgroud)

运行时,它会产生答案:

 0 1 2 3
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用宏,您甚至可以消除额外的大小参数:`#define processArray(a)processArray_func(sizeof(a)/ sizeof*(a),(a))`但是在宏参数中,您需要一个额外的集合复合文字周围的括号,以防止预处理器吃逗号...除非你使用一个非常丑陋的hack与`__VA_ARGS__`.:-) (2认同)
  • 虽然你可以使用宏(也可能是varargs,但它会变得混乱,如你所说),并且它避免了多次写入文字,你可能会在数组末尾使用sentinel值做得更好(例如a负整数). (2认同)