【问题标题】:Is it possible to have anonymous, ad-hoc arrays in C?是否可以在 C 中使用匿名的临时数组?
【发布时间】:2013-01-18 03:06:49
【问题描述】:

是否可以在 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;
}

【问题讨论】:

  • 这个问题被标记为关于 C++ 的问题的重复,而不是 C。
  • /同意迈克尔 - 这不是重复的; C 和 C++ 是 不同的 语言 - 而这种特殊情况只是突出差异的另一种情况!
  • int[] myArray?这不是 C#,必须是 int myArray[]

标签: c arrays


【解决方案1】:

使用 C99 和 C11,您可以编写自己编写的代码,如以下代码所示。这些是“复合文字”,在 ISO/IEC 9899:2011 §6.5.2.5 Compound literals 中进行了描述(与 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;
}

运行时,它会产生答案:

 0 1 2 3

【讨论】:

  • 请注意,使用宏,您甚至可以消除额外的大小参数:#define processArray(a) processArray_func(sizeof (a)/sizeof *(a), (a)) 但在宏参数中,您需要在复合文字周围使用一组额外的括号,以防止预处理器吃掉逗号。 ..除非你对__VA_ARGS__ 使用非常丑陋的黑客攻击。 :-)
  • 我提到这一点的部分原因是有些人认为这种设计是可变参数函数的适当现代替代方案。使用可变参数宏和复合文字,您可以使调用约定看起来与可变参数函数完全一样,但具有更多的结构(例如,以编程方式生成参数列表的能力、一些类型检查能力等)
  • 虽然你可以用宏来做到这一点(可能是可变参数,但正如你所说的那样,它会变得混乱),并且它避免了多次写出文字,你可能会用一个哨兵值做得更好数组的结尾(例如负整数)。
  • 确实,这也是一个不错的方法。
  • 上周我遇到了一个有趣的、稍微相关的问题。 #define SNBUFF(s) (s), sizeof(s) 然后像这样使用:snprintf(SNBUFF(fixed_array), "%s (%s) = %d\n", xxx, yyy, zzz);。看起来应该没问题;除非snprintf() 是宏,否则没关系。然后SNBUFF() 看起来像是宏的一个参数,一切都乱了套。在 Mac OS X 10.7.5 上,snprintf() 的宏通过 &lt;stdio.h&gt; 在包含的标头 security/_stdio.h 中定义,例如:#define snprintf(str, len, ...) __builtin___snprintf_chk(str, len, 0, __darwin_obsz(str), __VA_ARGS__)。解决方法是丢失 SNBUFF。
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2012-01-06
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多