C++替换预处理宏实现结构体数组定长与初始化的方案
解决方案
直接将自动修复生成的constexpr auto声明改为显式的数组类型即可,仅需修改一行代码:
constexpr wchar_t TITLE[] = L"Title";
修改后的完整可运行代码如下:
#include <iostream> int wmain() { constexpr wchar_t TITLE[] = L"Title"; struct { wchar_t title[ sizeof(TITLE) / sizeof(TITLE[0]) ]; int font_size; } s = { TITLE, 12, }; std::wcout << L"s.title = " << s.title << std::endl << L"s.font_size = " << s.font_size << std::endl; return 0; }
原因说明
VS的自动修复逻辑存在缺陷,用auto推导字符串字面量时,会将类型推导为const wchar_t *const指针类型,导致两个问题:
sizeof(TITLE)取到的是指针本身的大小(x64环境下为8字节,x86环境下为4字节),不是字符串的实际总字节数,数组长度计算错误- 字符数组无法直接用指针初始化,触发C2440编译错误
显式声明为constexpr wchar_t[]数组类型后:
sizeof(TITLE)返回整个字符串数组的字节数,包含末尾的\0,计算逻辑和原宏完全一致- 聚合初始化时可以直接用该数组给结构体的数组成员赋值,完全符合C++语法要求
C++20兼容写法
如果项目允许使用C++20标准,也可以用std::to_array声明,自动推导数组长度:
#include <array> constexpr auto TITLE = std::to_array(L"Title"); // 数组长度可以直接用TITLE.size()获取,不需要手动计算sizeof
内容的提问来源于stack exchange,提问作者z32a7ul
相关产品推荐
相关产品推荐

