我已按如下方式定义了一个宏:
#define SOME_STRING "some_string"
并且存在类型为void*
的字段。因此,为了将"some_string"
的地址分配给该字段,我已经这样做了:
boxFixtureDef.userData = static_cast<void*>(SOME_STRING);
MVS 2012没有抱怨,但Xcode和g ++报告错误:invalid static_cast from type 'const char [12]' to type 'void*'
。怎么了?如何解决这个问题?
答案 0 :(得分:7)
使用const_cast删除constness。 static_cast不能改变变量的常量。
#include <iostream>
#define MACRO_TEXT "macro-text"
int main()
{
void *ptr = const_cast<char*>(MACRO_TEXT);
std::cout << ptr << std::endl;
return 0;
}
(你不必显式地将char *转换为void *。它将被隐式完成。)
小心点。您不允许修改userData中的值,因为原始指针是const char []在这种情况下,您只能从userData读取值。
答案 1 :(得分:1)
static_cast
无法抛弃常量。为此,您需要const_cast
:
static_cast<void*>("something"); // This doesn't compile
static_cast<const void*>("something"); // This does
const_cast<void *>(static_cast<const void*>("something")); // This does, too.
同样,将指针隐式转换为void *
并不会影响cv限定符:
void *something = "something"; // This doesn't compile
void *something2 = const_cast<char *>("something"); // This does; the char * from the cast is implicitly converted
void *something3 = const_cast<void *>(static_cast<const void*>("something")); // This does, too, but is more verbose.
但是,如果有人试图实际修改结果指针所指向的内容,那么它就是未定义的行为。因此,如果boxFixtureDef.userData
指向的内容有可能被修改,那么您就不应该这样做。如果没有,为什么不将其设为const void *
?
答案 2 :(得分:1)
这解决了,但我不知道这是多么正确:
boxFixtureDef.userData = reinterpret_cast<void*>(const_cast<char*>(SOME_STRING);
答案 3 :(得分:0)
只需使用(void *)(SOME_STRING)
即可。