如何在不使用变量 C/C 的情况下将常量数组文字传递给采用指针的函数?

新手上路,请多包涵

如果我有一个看起来像这样的原型:

 function(float,float,float,float)

我可以传递这样的值:

 function(1,2,3,4);

所以如果我的原型是这样的:

 function(float*);

有什么办法可以实现这样的目标吗?

 function( {1,2,3,4} );

只是在寻找一种不创建临时变量的懒惰方法,但我似乎无法确定语法。

原文由 sinoth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 530
2 个回答

您可以使用 复合文字 在 C99(但 不是 ANSI C (C90) 或任何当前的 C++ 变体)中执行此操作。有关详细信息,请参阅 C99 标准的第 6.5.2.5 节。这是一个例子:

 // f is a static array of at least 4 floats
void foo(float f[static 4])
{
   ...
}

int main(void)
{
    foo((float[4]){1.0f, 2.0f, 3.0f, 4.0f});  // OK
    foo((float[5]){1.0f, 2.0f, 3.0f, 4.0f, 5.0f});  // also OK, fifth element is ignored
    foo((float[3]){1.0f, 2.0f, 3.0f});  // error, although the GCC doesn't complain
    return 0;
}

GCC 也将其作为 C90 的扩展提供。如果您使用 -std=gnu90 (默认)、 -std=c99-std=gnu99 进行编译,它将编译;如果你用 -std=c90 编译,它不会。

原文由 Adam Rosenfield 发布,翻译遵循 CC BY-SA 2.5 许可协议

我问过 OpenAI Codex,它建议了这个方法:

 func((uint8_t *) "\x12\x34\x56\x78\x9a\xbc")

它适用于嵌入式 C90,而复合文字则不能( syntax error near '{', expected 'sizeof' )。

不过,与创建本地范围数组相比,并没有太多好处:

 {
    uint8 da[6] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc};
    func(da);
}

原文由 endolith 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题