你好
我使用了下面的C宏,但是在**C++**中它不能自动将void*
转换为type*
。
#define MALLOC_SAFE(var, size) { \
var = malloc(size); \
if (!var) goto error; \
}
字符串
我知道,我可以这样做:
#define MALLOC_SAFE_CPP(var, type, size) { \
var = (type)malloc(size); \
if (!var) goto error; \
}
型
但我不想重写大部分代码,其中使用了MALLOC_SAFE
。
有没有什么方法可以做到这一点,而不给类型的宏?也许一些MSVC 2005#pragma
/__declspec
/其他?
我不能使用C编译器,因为我的代码是大型项目的一部分(数百个模块中的一个)。现在是C++。我知道,我可以单独构建代码。但这是旧代码,我只想快速移植。
这个问题是关于void* 铸造的;如果不可能,我将用MACRO_SAFE_CPP替换MACRO_SAFE
谢谢!**
4条答案
按热度按时间daolsyd01#
为了让James的答案更脏,如果你没有
decltype
支持,你也可以这样做:字符串
然后:
型
别用它做坏事。
yeotifhr2#
我不建议这样做;这是一段糟糕的代码,如果你使用的是C,你应该用C编译器编译它(或者,在Visual C++中,作为C文件)
如果你使用的是Visual C++,你可以使用
decltype
:字符串
sczxawaw3#
例如,像这样:
字符串
mbskvtky4#
为什么没有人把你的参数 * var* 强制转换为SAFE_MALOC()?我的意思是,malloc() 返回指针。你把它存储在一个接受指针的地方…有很多其他人已经指出的类型安全的东西……我只是在想为什么这行不通
字符串
是啊我知道这是病态的,并抛出类型安全的权利窗外。但是直接的 *((void )(var))= 强制转换并不总是有效。