> C ++在没有给出类型的情况下,自动将void指针转换为C ++中的类型指针(#define)(C
嗨!
我使用了下面的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
/ other?
ps:我不能使用C编译器,因为我的代码是大型项目的一部分(数百个模块之一)。 现在它在C ++上。 我知道,我可以单独构建我的代码。 但它是旧代码,我只想快速移植它。
问题是关于void * casting;)如果这是不可能的,我将用MACRO_SAFE_CPP替换MACRO_SAFE
谢谢!
我不建议这样做; 这是可怕的代码,如果你使用C,你应该用C编译器编译它(或者,在Visual C ++中,作为C文件)
如果您使用的是Visual C ++,则可以使用decltype
:
#define MALLOC_SAFE(var, size)
{
var = static_cast<decltype(var)>(malloc(size));
if (!var) goto error;
}
为了让詹姆斯的答案更加肮脏,如果你没有decltype
支持,你也可以这样做:
template <typename T>
class auto_cast_wrapper
{
public:
template <typename R>
friend auto_cast_wrapper<R> auto_cast(const R& x);
template <typename U>
operator U()
{
return static_cast<U>(mX);
}
private:
auto_cast_wrapper(const T& x) :
mX(x)
{}
auto_cast_wrapper(const auto_cast_wrapper& other) :
mX(other.mX)
{}
// non-assignable
auto_cast_wrapper& operator=(const auto_cast_wrapper&);
const T& mX;
};
template <typename R>
auto_cast_wrapper<R> auto_cast(const R& x)
{
return auto_cast_wrapper<R>(x);
}
然后:
#define MALLOC_SAFE(var, size)
{
var = auto_cast(malloc(size));
if (!var) goto error;
}
我在我的博客上扩展了这个实用工具(在C ++ 11中)。 除了邪恶之外,不要使用它。
例如,像这样:
template <class T>
void malloc_safe_impl(T** p, size_t size)
{
*p = static_cast<T*>(malloc(size));
}
#define MALLOC_SAFE(var, size) {
malloc_safe_impl(&var, size);
if (!var) goto error;
}
链接地址: http://www.djcxy.com/p/72927.html