c - 如何在不使用指针的情况下在 C 中无转换地转换对象?

标签 c

我想将 C 中的对象转换为另一种类型,而不转换数据,也不需要使用指针。我知道你可以用这种方式做到这一点:

float a = 1.2;
int b = *(int*)(&a);

但我希望能够对就地构建的文字和结构执行此操作(如果这是正确的术语)。例如(想象一下我可以暂时引用一个文字):

void somefunc(int i){...}

somefunc(*(int*)(&1.2))

就地构建的意思是,假设我有一个 struct vec2:

struct vec2{
    float x,y;
};

我希望能够做类似的事情

void somefunc(vec2 v){...}

somefunc(ConversionlessCast(vec2{1.f,2.f}))

这可能吗?

编辑: 我想澄清一下,我不在乎这是否安全。我只是想知道是否有办法做到这一点。我应该澄清一下,我不想也不必创建临时变量。

编辑2: 我意识到如果没有示例,这个问题的表述是多么糟糕,并且在最初输入示例时,我意识到我想用它来做什么的答案是什么。

我正在尝试一种为我正在开发的 ui 系统进行样式设置的方法,并且希望能够使用一个函数来设置样式属性。我想传递一个字符串,然后传递一个值,并使用该字符串来确定如何解释该值。现在很明显我应该使用 va_args 来这样做。然而,我仍然对是否有一种方法可以完成我最初要求的事情感兴趣,因为我最初的计划是使用包含属性可能的所有类型的 union 类型,例如

struct Property{
  union{
    u32 val_u32;
    f32 val_f32;
    //other possible types
  };
};

,然后使用前面的字符串来选择要使用的值。不幸的是,使用初始值设定项列表仅接受第一种类型,即 u32。所以我想想出一种以类似的方式初始化属性的方法

#define Property(x) Property{(magic that reinterprets anything as the first type on property})

Property(vec2{1.f,2.f})

最佳答案

您可以使用复合文字中的 union 将一个对象的字节重新解释为另一个对象的字节。在此代码中:

printf("%d\n", (union { float f; int i; }) {a} .i);

创建一个 union ,并使用a的值初始化其f成员。然后 i 成员由 .i 访问。根据 C 2018 第 6.5.2.3 4 条的第 99 条注释,用新类型 int 重新解释字节。

(这是针对 C 的。其行为不是由 C++ 标准定义的。)

关于c - 如何在不使用指针的情况下在 C 中无转换地转换对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72537840/

相关文章:

c - 如何在 linux 用户空间应用程序中获得最精确的时钟?

android - 如何为 android 正确使用 strerror_r()

c - C语言如何收集多个格式参数?

c - 在 C 微 Controller 中设置位

iphone - glReadPixels 不适用于 iPhone

c++ - '&' 在 C/C++ 中的作用是什么?它在 perl 中的等效运算符是什么?

c - msgrcv 获取空白消息

c - Mmap 不使用给定的地址

c++ - float 组的中间模式平均计算

c - 使用 libdl 的 C 语言插件架构