1. 每一行最后的 \ 是什么
这是C/C++ 预处理器的换行符,用于让宏定义可以写成多行。
比如:
#define MY_MACRO(a, b) \
do_something(a); \
do_something_else(b)预处理器会把它当成一行处理。
如果没有 \,宏只能写一行,写多行会报错。
2. L 前缀是转成了 std::wstring 还是 hstring?
L 前缀把字符串字面量变成宽字符串字面量,类型是 const wchar_t*,比如:
L"abc" // 类型是 const wchar_t*std::wstring是 C++ 标准库的宽字符串类,可以用L"abc"构造。winrt::hstring是 WinRT 的字符串类型,也可以用L"abc"或std::wstring构造。
本宏只是让参数变成宽字符串字面量(const wchar_t*),最终会被 std::wstring_view 或 std::wstring 接收。
总结
\让宏可以多行书写,实际等价于一行。L让字符串变成宽字符串字面量(const wchar_t*),最终通常用于std::wstring或std::wstring_view,也可以间接用于hstring。
1. 每一行最后的 \ 是什么?
这是C/C++ 预处理器的换行符,用于让宏定义可以写成多行。
比如:
#define MY_MACRO(a, b) \
do_something(a); \
do_something_else(b)预处理器会把它当成一行处理。
如果没有 \,宏只能写一行,写多行会报错。
2. L 前缀是转成了 std::wstring 还是 hstring?
L 前缀把字符串字面量变成宽字符串字面量,类型是 const wchar_t*,比如:
L"abc" // 类型是 const wchar_t*std::wstring是 C++ 标准库的宽字符串类,可以用L"abc"构造。winrt::hstring是 WinRT 的字符串类型,也可以用L"abc"或std::wstring构造。
本宏只是让参数变成宽字符串字面量(const wchar_t*),最终会被 std::wstring_view 或 std::wstring 接收。L"xxx" 只是宽字符串字面量,类型是 const wchar_t*,它不会自动变成 WinRT 的 hstring 类型。原因如下:
1. C++ 字符串字面量类型
"abc"→const char*L"abc"→const wchar_t*u8"abc"→const char8_t*u"abc"→const char16_t*U"abc"→const char32_t*
这些都是原生C++类型,不会自动变成 std::wstring、std::u16string 或 winrt::hstring。
2. hstring 是什么
winrt::hstring 是 WinRT 的字符串类型,本质上是一个类。
它可以通过构造函数从 const wchar_t* 或 std::wstring 创建,但不会自动隐式转换。
例如:
winrt::hstring s1 = L"abc"; // OK,构造
winrt::hstring s2 = std::wstring(L"abc"); // OK但如果函数参数是 std::wstring_view 或 const wchar_t*,你传 L"abc",它不会自动变成 hstring。
3. 宏和类型推导
你的宏:
#define XAML_INIT_THIS_REL(PATH_OR_NAME) \
::xaml_helpers::InitializeWithFlag(*this, this->_contentLoaded, L##PATH_OR_NAME, ::xaml_helpers::XamlPathKind::RelativeToRoot)这里 L##PATH_OR_NAME 结果是 L"xxx",类型是 const wchar_t*,
而 InitializeWithFlag 的参数类型是 std::wstring_view,它可以接受 const wchar_t*,但不是 hstring。 本拼接,不会做类型转换。
1. L 前缀不是 hstring 的强制转换
L"xxx"只是C++标准的宽字符串字面量,类型是const wchar_t*。- 它和
hstring没有直接关系,也不是hstring的强制转换或构造。
2. hstring 的构造
winrt::hstring 可以通过构造函数从 const wchar_t* 或 std::wstring 创建,例如:
winrt::hstring s1 = L"abc"; // 构造,OK
winrt::hstring s2{L"abc"}; // 构造,OK
winrt::hstring s3 = std::wstring(L"abc"); // 构造,OK但只有你显式写 winrt::hstring 时才会转换,否则 L"abc" 只是 const wchar_t*。
3. 宏参数类型
你的宏只是把参数变成 L"xxx",传递给的函数参数类型是 std::wstring_view,不是 hstring。
如果你想让它变成 hstring,需要这样写:
winrt::hstring(L"abc")或者让函数参数类型直接是 winrt::hstring。