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;
}