C 将数字/字符/字符串发送到void*函数

C 将数字/字符/字符串发送到void*函数,c,void-pointers,C,Void Pointers,有没有办法做到这一点: void set(void* data, void *value, t_flags type) { if (type & INT) *(int*)data = *(int*)value; if (type & UINT) (...) } int i; set(&i, 42, INT); 我的set函数可以工作,但我不知道如何用number、char“”或string“”调用它 编辑:我忘记了最后一

有没有办法做到这一点:

void set(void* data, void *value, t_flags type)  
{
    if (type & INT)
        *(int*)data = *(int*)value;
    if (type & UINT)
    (...)
}

int i;  
set(&i, 42, INT);
我的set函数可以工作,但我不知道如何用number、char“”或string“”调用它


编辑:我忘记了最后一个参数,但问题来自42参数。

一些事情。首先,由于对
使用了
void*
(这是合适的),因此需要传递
void*
作为第二个参数,而不是常量。这可以将一个变量复制到下一个变量,但是有更有效的方法

其次,请注意,要传递字符串,需要将指针传递给char指针,char*将由函数设置。(这取决于你是“软拷贝”还是“硬拷贝”——即指针指向内存中的同一位置还是指向同一字符串的另一个副本。你说你已经实现了
设置
,所以我猜你已经实现了你想要的方式

您还没有包括您的t_标志枚举,因此我猜测了适当的值

char  c = 'c';
char* str = "str";
int   i = 42;
char  c2;
char* str2;
char  i2;

set(&c2, &c, CHAR); /* presumably you have a CHAR flag? */
set(&str2, &str, CHARPTR); /* presumably you have a CHARPTR flag? */
set(&i2, &i, INT);
对我来说,更大的问题是,为什么要这样做,特别是因为在你的旗帜中,你已经需要知道类型。简单地执行以下操作会更干净(并且有更好的类型检查):

c2 = c;
str2 = str;
i2 = i;
我假设这只是为了学习函数,或者是为了解决一个复杂的问题而对其进行了大量简化。不管怎样,这都是您要做的。

也许您希望这样:

void set(void* data, void *value, t_flags type)  
{
    if (type & INT)
        *(int*)data = *(int*)value;
    if (type & UINT)
        *(unsigned int*)data = *(unsigned int*)value;
    if (type & STRING)
        strcpy((char*)data, (char*)value);
    ...
}

int i;  
char string[100] ;
set(&i, 42, 1<<INT);
set(string, "Hello world", 1<<STRING) ;
void集(void*数据、void*值、t_标志类型)
{
如果(输入(&INT)
*(int*)数据=*(int*)值;
if(类型和UINT)
*(无符号整数*)数据=*(无符号整数*)值;
if(类型和字符串)
strcpy((char*)数据,(char*)值;
...
}
int i;
字符串[100];

set(&i,42,1您只向函数
set
传递了两个参数。虽然您的实现在概念上没有什么问题,但您只是复制了一个功能较弱的
memcpy
——我建议您改用它。
#定义set(数据,值)memcpy(数据,值,sizeof(值)) @ TyMangMyKes,你无论如何都应该直接使用<代码> MeMCPY < /C++ >。许多编译器也提供了优化的<代码> MeMCPY < /Cord>版本。当调用SET.+1时,类型参数不见了:需要从地址传递值的好点,而不是直接由值传递。我试图从C++中重新激活向量,而我只能这样做。我想C有一个技巧来做我想要的,但是我似乎需要使用临时变量。在C++中,生命是更容易的,因为你有模板。你可以用宏来做同样的事情,但不太可能。你有没有搜索过“C向量”??我看到至少有两个对您有用的点击弹出窗口-学习或使用(当然,这取决于任何许可限制):(第二个确实使用了void指针,但似乎比您的示例更先进。)感谢链接,他们解决了我在vector上遇到的其他一些问题。