【发布时间】:2020-08-20 13:14:54
【问题描述】:
我正在尝试构建一个可以填充结构的通用函数无需任何动态内存分配。
以下代码是我正在尝试做的一个简单示例。
此代码不会编译为incomplete type 'void' is not assignable。
请注意,这是一个突出我的问题的玩具示例。我真的不想转换颜色;我只是想强调一下,这些结构的数据类型和大小会有所不同。
#include <stdio.h>
typedef struct {
int r;
int g;
int b;
} rgb_t;
typedef struct {
float c;
float m;
float y;
float k;
} cmyk_t;
typedef enum { RGB, CMYK } color_t;
void convert_hex_to_color(long hex, color_t colorType, void* const out) {
if (colorType == RGB) {
rgb_t temp = { 0 };
// Insert some conversion math here....
temp.r = 1;
temp.g = 2;
temp.b = 3;
*out = temp; //< [!]
} else
if (colorType == CMYK) {
cmyk_t temp = { 0 };
// Insert some conversion math here....
temp.c = 1.0;
temp.m = 2.0;
temp.y = 3.0;
temp.k = 4.0;
*out = temp; //< [!]
}
}
int main(void) {
// Given
long hex = 348576;
rgb_t mydata = { 0 };
convert_hex_to_color(hex, RGB, (void*)(&mydata));
// Then
printf("RGB = %i,%i,%i\r\n", mydata.r, mydata.g, mydata.b);
return 0;
}
对于一些额外的上下文,我在嵌入式系统目标上使用 C11。
最好的[1] 方法是什么?宏?联合?
问候,
加布里埃尔
[1] 我将“最佳”定义为可读性和安全性之间的良好折衷。
【问题讨论】:
-
可以使用
*out = temp;-->memcpy(out, &temp, sizeof temp);并让编译器针对高效发出的代码进行优化。 -
注意;
convert_hex_to_color(hex, RGB, (void*)(&mydata));--> C 中不需要强制转换。 -
你可以替换第一个 'out = temp;'与 '*(rgb_t)out=temp;'等等。只要 void* 实际上是指向正确类型转换为 void* 的指针,这将起作用,
-
@dmuir 我想你想要
*(rgb_t*)out=temp;(另一个*) -
@chux 显式转换(to
void*)在 C++ 中也不需要。
标签: c generic-programming void-pointers c11