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

时间:2013-12-17 15:34:02

标签: 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);

我的设置功能有效,但我不知道如何用数字,字符'或字符串“”来调用它。

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

2 个答案:

答案 0 :(得分:3)

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

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

你没有包含你的t_flags枚举,所以我猜到了合适的值。

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;

我认为这仅仅是为了学习功能,或者是针对复杂问题进行了大量简化。无论哪种方式,你就是这样做的。

答案 1 :(得分:0)

也许你想要这个:

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) ;

但无论如何它都很奇怪。