gpt4 book ai didi

c - 将虚拟结构或 union 传递给 C 中的函数

转载 作者:行者123 更新时间:2023-12-02 01:15:44 25 4
gpt4 key购买 nike

这是 C 中那些奇怪的极端情况之一,C++ 可能会自然地处理它,但 C 似乎没有合适的习惯用法。

背景

我有一个 union (它可以很容易地成为一个结构),像这样:

union foo {
int a;
char b;
...
};

union 很小:它的一些类型是“重要的”,但它保证适合处理器寄存器。

因为它是寄存器大小的,所以我有传递它并直接返回它的函数,这样既安全又快速:

union foo bar(union foo x) {
...
}

现在,我有一整批函数,其原型(prototype)由宏生成,如下所示:

#define DECLARE_QUX(__y__) \
static void qux(__y__ a, union foo b)

(所有类型名称和 typedef 都已更改以保护无辜者。)

这工作正常,并且在目标代码中它读起来很干净。我可以调用函数,传递 union ,一切都按照它应有的方式进行。

问题

但是我在尝试调用生成的 qux() 函数时遇到了问题。在某些情况下,我知道传递给 qux() 的 union 完全不相关。过去了什么并不重要;我知道被叫方会忽略它。但我无法更改 qux() 函数的签名,所以我不得不这样做,以便能够传递 union 的无用“虚拟”版本:

static union foo dummyUnion = { 0 };

qux(realData, dummyUnion);

这行得通,但确实很笨重。我真正希望能够做的是类似于 C++ 的“魔力零”:

qux(realData, 0);

或 C 化版本:

qux(realData, (foo)0);

但这当然行不通,因为您不能将整数转换为 union 。

通读我的 K&R 副本,看起来这并没有真正被视为语言的一部分; ANSI 标准增加了直接传递结构和 union 的能力(如有必要,在后台使用 memcpy()),主要是因为每个编译器都已经支持它。但看起来他们并没有设计出一种方法来在表达式中间就地声明具有值的此类形状。

问题

所以,tl;dr:有没有办法在 C 中的函数调用期间就地声明一个“虚拟 union ”,或者我是否坚持只声明一个 static 实例来传递?

最佳答案

一些进一步的研究发现一些编译器现在允许这种形式:

qux(realData, (foo){ 0 });

比较 K&R(第二版)与 C99 standard ,它看起来像 postfix-expression 产生式(参见第 409 页,6.5.2),已被扩展以支持 ANSI 1989 标准中不存在的新形式:

postfix-expression ::= ( type-name ) { initializer-list }

这解决了确切的问题,并且适用于结构和 union 。

就是说,我不确定哪些编译器符合该新产品(VC++ 2013 似乎接受它,我敢打赌 GCC 和 clang 也会接受)。但由于它现在由 C 标准定义,因此看起来足以在实际代码中使用。

关于c - 将虚拟结构或 union 传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42749460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com