【问题标题】:C - Send array to function without declaring it [duplicate]C - 将数组发送到函数而不声明它[重复]
【发布时间】:2014-06-17 19:19:01
【问题描述】:

是否可以在不先声明/定义的情况下将数组发送到 C 函数?

这对于整数是可能的。

int add(int a, int b) {
    return (a + b);
}

void main(void) {
    int c;
    int a=1, b=2;

    /* With declaring (works fine)*/
    c = add(a, b);

    /* Without declaring (works fine)*/
    c = add(1, 2);
}

数组有什么类似的吗?

#include <stdio.h>

void print_int_array(int *array, int len) {
    int i;
    for (i = 0; i < len; i++)
        printf("%d -> %d\n", i, *array++);
}

void main(void) {
    int array[] = {1, 1, 2, 3, 5};

    /* With declaring (works just fine) */
    print_int_array(array, 5);

    /* Without declaring (fails to compile) */
    print_int_array({1, 1, 2, 3, 5}, 5);
}

【问题讨论】:

  • 很好地提出了第一个问题,除了它是重复的。为了更深入地挖掘,IMO print_int_array(int *array, int len) 的示例不是对“复合文字”的良好使用,因为应该以最小的相互依赖性来调用这样的函数,如 print_int_array(array, sizeof array/sizeof array[0]); 不确定如何在这里使用复合文字.

标签: c arrays declaration


【解决方案1】:

是的。你可以。在 C99/11 中,您可以使用 compound literals

C11:6.5.2.5 复合文字:

一个后缀表达式,由带括号的类型名称后跟大括号括起来的 初始化器列表是复合文字。它提供了一个未命名的对象,其值由初始化列表给出。99)

print_int_array((int[]){1, 1, 2, 3, 5}, 5);  

99) 请注意,这与强制转换表达式不同。例如,强制转换指定到标量类型的转换 或仅void,并且强制转换表达式的结果不是左值。

【讨论】:

  • 我之所以选择这个是因为省略了尺寸声明以便以后更容易编辑。
【解决方案2】:

是的,从 c99 开始就有可能使用复合文字:

print_int_array((int [5]) {1, 1, 2, 3, 5}, 5);

( ){ } 是复合文字运算符。复合文字提供了一种指定聚合或联合类型的未命名常量的机制。 (非常量)复合文字是可修改的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2012-06-12
    • 1970-01-01
    • 2011-10-05
    • 2016-02-22
    • 2010-11-08
    相关资源
    最近更新 更多