gpt4 book ai didi

c++ - atoi() 相当于 intptr_t/uintptr_t

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:15 27 4
gpt4 key购买 nike

C++(C++11,如果它有所不同)中是否有一个函数可以将字符串转换为 uintptr_tintptr_t?我总是可以使用 atoll() 并在之后转换它,但最好是获得一个函数,该函数对 32 位机器执行 32 位操作,对 64 位机器执行 64 位操作。

char* c = "1234567";
uintptr_t ptr = atoptr(c); // a function that does this;

最佳答案

这是 C++ 中 IMO 令人惊讶的差距。虽然 stringstream 完成了这项工作,但对于这样一个简单的任务来说,它是一个相当繁重的工具。相反,您可以编写一个内联函数,根据类型大小调用 strtoul 的正确变体。由于编译器知道正确的大小,因此它会足够聪明地用对 strtoul 或 strtoull 的调用替换对函数的调用。即,类似于以下内容:

    inline uintptr_t handleFromString(const char *c, int base = 16)
{
// See if this function catches all possibilities.
// If it doesn't, the function would have to be amended
// whenever you add a combination of architecture and
// compiler that is not yet addressed.
static_assert(sizeof(uintptr_t) == sizeof(unsigned long)
|| sizeof(uintptr_t) == sizeof(unsigned long long),
"Please add string to handle conversion for this architecture.");

// Now choose the correct function ...
if (sizeof(uintptr_t) == sizeof(unsigned long)) {
return strtoul(c, nullptr, base);
}

// All other options exhausted, sizeof(uintptr_t) == sizeof(unsigned long long))
return strtoull(c, nullptr, base);
}

如果您决定更改句柄类型,这将很容易更新。如果您喜欢尖括号,您也可以使用模板做一些等效的事情,尽管我看不出那样更清楚。

最后,您还可以使用 sscanf%tx 格式,即

inline uintptr_t handleFromString(const char *c)
{
ptrdiff_t h;
sscanf(c, "%tx", &h); // only hex supported, %td for decimal.
return (uintptr_t)h;
}

不幸的是,我在 Compiler Explorer 上尝试过的编译器都无法以消除对 sscanf 调用的方式优化代码。

关于c++ - atoi() 相当于 intptr_t/uintptr_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com