我想将 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/