将定义的宏字符串转换为void *

时间:2014-07-20 03:31:56

标签: c++

我已按如下方式定义了一个宏:

#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*'。怎么了?如何解决这个问题?

4 个答案:

答案 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)即可。