C ++与C中函数调用中的void指针

时间:2017-04-03 03:34:02

标签: c++ c void-pointers

我有这段代码在C语言中工作但不是C ++,是否可以使它在C和C ++上工作?

void foo(void* b)
{
   int *c = b;
   printf("%d\n",*c); 

}

int main ()
{
 int a = 1000;

 foo(&a);
 return 0;
}

输出:

C ++:

1 In function 'void foo(void*)':
2 Line 3: error: invalid conversion from 'void*' to 'int*'
3 compilation terminated due to -Wfatal-errors.

C:

1000

请帮忙

3 个答案:

答案 0 :(得分:9)

  

void*int*

的无效转换

要从void*转换为int*,您需要将b转换为int*,然后将其分配给c。做:

int *c = (int*) b;

这适用于C ++和C。

答案 1 :(得分:4)

C允许void*和任何指向对象类型的指针之间的隐式转换,而C ++则不然。要使代码与这两种语言兼容,您可以输入foo( (void*)&a );

但是,在两种语言中都不鼓励使用void指针 - 它们只应作为最后的手段使用。如果您希望函数在C中是类型泛型的,则使用_Generic关键字。在C ++中,您使用模板。

答案 2 :(得分:1)

考虑到两种语言的所有投射问题,正确的方法是 -

#ifdef __cplusplus
#define cast_to_intp(x) static_cast<int*>(x)
#else
#define cast_to_intp(x) (x)
#endif

然后使用

int *c = cast_to_intp(b);