gpt4 book ai didi

C++ 在编译时创建 BSTR/在编译时将长度插入字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:23 25 4
gpt4 key购买 nike

是否可以在编译时使用宏魔术或 TMP 将长度插入字符串?

例如:

const wchar_t* myString = L"Hello";

我希望缓冲区实际包含“[长度] [字符串常量]”。

我正在使用缺少 constexpr 的 MSVC 2010。我想一定有一些技巧可以使这项工作成为可能:

const wchar_t* myString = L"\x005Hello";

到目前为止我的尝试:

template<int Size>
wchar_t* toBstr(const wchar_t* str)
{
#pragma pack(push)
#pragma pack(1)
struct BStr
{
int len;
wchar_t data[Size];
};
#pragma pack(pop)

static BStr ret;
ret.len = Size;

// don't want to have to copy here, how else could this work??
//ret.data = str;

return ret.data;
}

const wchar_t* m = toBstr<_countof(L"Hello")>(L"Hello");

这个问题似乎相关:

C++ template string concatenation

但不是连接两个字符串常量,而是从第二个字符串的长度生成的常量:)

最佳答案

您不能创建编译时 BSTRBSTR 被定义为由 SysAllocString 和 family 分配。如果不是,则不是 BSTR,而是冒名顶替者。

但是如果 BSTR 的内容在编译时是已知的,你可以有一个全局的 BSTR 变量,并且只分配一次,避免你的数千次分配很关心。

即,将变量声明为 BSTR,但使用 SysAllocString 将其初始化为字符串。

例如:

BSTR bsHello = SysAllocString(L"Hello");

关于C++ 在编译时创建 BSTR/在编译时将长度插入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20264616/

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