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

C++ 将定义的宏字符串转换为void*,c++,C++,我定义了一个宏,如下所示: #define SOME_STRING "some_string" 还有一个字段的类型为void*。因此,为了将“some_string”的地址分配给该字段,我执行了以下操作: boxFixtureDef.userData = static_cast<void*>(SOME_STRING); boxFixtureDef.userData=static\u cast(一些字符串); MVS 2012没有抱怨,但Xcode和g++报告错误:从类型“co

我定义了一个宏,如下所示:

#define SOME_STRING  "some_string"
还有一个字段的类型为
void*
。因此,为了将
“some_string”
的地址分配给该字段,我执行了以下操作:

boxFixtureDef.userData = static_cast<void*>(SOME_STRING);
boxFixtureDef.userData=static\u cast(一些字符串);

MVS 2012没有抱怨,但Xcode和g++报告错误:
从类型“const char[12]”到类型“void*”
的静态转换无效。怎么了?如何修复此问题?

静态\u cast
无法摆脱常量。为此,您需要
const\u 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.

但是,如果有人试图实际修改结果指针指向的内容,这是未定义的行为。因此,如果有可能修改
boxFixtureDef.userData
所指向的内容,您不应该这样做。如果不是,为什么不把它变成一个
常量void*

只要使用
(void*)(一些字符串)

这个问题解决了,但我不知道这有多正确:

boxFixtureDef.userData = reinterpret_cast<void*>(const_cast<char*>(SOME_STRING);
boxFixtureDef.userData=重新解释强制转换(const强制转换(一些字符串);

使用const\u cast删除constness。 静态_cast无法更改变量的常量

#include <iostream>

#define MACRO_TEXT "macro-text"

int main()
{
    void *ptr = const_cast<char*>(MACRO_TEXT);
    std::cout << ptr << std::endl;
    return 0;
}
#包括
#定义宏文本“宏文本”
int main()
{
void*ptr=const\u cast(宏文本);

std::任何指针都需要显式地投射到
void*
指针,这难道不寻常吗?这可能更像是一个
const
投射相关的问题吗?这并没有回答要求的问题。使用大锤并不总是适用于您当前的工件。这会起作用,尽管一般来说,使用在各种类型的铸件中,至少C++是最不可能的。has@MattMcNabb它只是隐藏了真正有意识的决策中的细节。我从不建议这样做,这只是一个糟糕的建议。让它正常工作并不总是关键。reinterpret_cast主要用于指向/来自整数的指针(例如uintptr__t)转换(至于重新解释性质),在这种情况下,您应该使用static_cast,或者只使用const_cast并隐式转换为void*。使用
static_cast
编辑答案!我如何修改userData中的值?例如,一些代码,如static_cast(userData)[0]='a',将导致未定义的行为。
#include <iostream>

#define MACRO_TEXT "macro-text"

int main()
{
    void *ptr = const_cast<char*>(MACRO_TEXT);
    std::cout << ptr << std::endl;
    return 0;
}