我有这段代码在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
请帮忙
答案 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);