【问题标题】:Pass R-Value array in C在 C 中传递 R 值数组
【发布时间】:2021-01-30 10:08:42
【问题描述】:

如果我们考虑函数

int sum(int* nums, size_t len)
{
    int sum = 0;
    for(int i = 0; i < len; i++) sum += nums[i];
    return sum;
}

我们可以使用这样的左值来调用它

int[] nums = {1,2,3};
sum(nums, 3);

但是当尝试使用右值时它不起作用。

sum({1,2,3}, 3);

有没有办法让它工作?

【问题讨论】:

  • 您在 void 函数中有一个 return 语句。删除返回或使 sum 函数的返回类型为int
  • 你是完全正确的,对不起,我没有太关注这个例子,因为那不是重点,但会修复它 rn
  • 无论如何它都不起作用,因为您的sum 函数返回void。但是你可以使用compound literals:sum((int[]){1,2,3}, 3);。您甚至可以将sum 包装在一个自动确定数组长度的宏中。或者你可以写1 + 2 + 3。 (我认为您想要的不是 C 中的常见用例。)
  • 当然这是一个最小的例子,我实际上想处理一个字符**
  • 很公平。我可以想象像key_in(str, {"red", "green", "blue", NULL}) 这样的东西。

标签: arrays c implicit-conversion rvalue


【解决方案1】:

您可以使用compound literal(在C99或更高版本中可用)并直接传递它:

$ cat t.c
#include <stdio.h>

int sum(int* nums, size_t len)
{
    int sum = 0;
    for(int i = 0; i < len; i++) sum += nums[i];
    return sum;
}

int main()
{
    int rc = sum((int []){1,2,3}, 3);
    printf("%d\n", rc);
}
$ gcc -Wall -Werror -std=c18 -pedantic t.c
$ ./a.out 
6

复合文字的生命周期是其封闭的 - 在这种情况下,它是main 函数。

【讨论】:

  • 有趣的是,这给了我一个“不允许转换为不完整数组类型“int []”的错误
  • 你的编译器是什么,它支持 C99 吗?你是如何编译的(命令/选项)?
  • 我只是在使用普通的 VS。 IDE 告诉我上述错误,而在构建时我收到“带括号的类型后跟初始化列表是非标准的显式类型转换语法”
  • MS 不支持所有 C 功能。我怀疑 C99 的复合文字就是其中之一。
  • 嗯,奇怪。所以基本上我想从一个接收数组的函数中创建一个静态常量。鉴于复合文字不是一种选择,您是否看到任何其他方式?
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多