C++ 在Windows之外使用wchar\t时,如何禁用或发出警告?

C++ 在Windows之外使用wchar\t时,如何禁用或发出警告?,c++,gcc,wchar-t,C++,Gcc,Wchar T,> WCARGYT类型在Windows API和从它们派生的C++标准库API中广泛使用,因此很难改变Windows代码使用其他东西,因为每次都必须来回转换/转换。 但在非Windows范围内,很少使用字符,而是首选UTF-8编码。因此,在Windows之外使用wchar__t的代码可能会出错,即使它是有意的,也最好使用能够更好地传达意图的类型,例如,在处理UTF-16字符串时使用std::u16string和char16_t而不是wstring,在存储Unicode码点时使用std::u32s

> WCARGYT类型在Windows API和从它们派生的C++标准库API中广泛使用,因此很难改变Windows代码使用其他东西,因为每次都必须来回转换/转换。 但在非Windows范围内,很少使用字符,而是首选UTF-8编码。因此,在Windows之外使用wchar__t的代码可能会出错,即使它是有意的,也最好使用能够更好地传达意图的类型,例如,在处理UTF-16字符串时使用std::u16string和char16_t而不是wstring,在存储Unicode码点时使用std::u32string和char32_t


有没有一个GCC选项可以打开一个诊断项目范围,当它看到一个wchar\u t时会发出警告或错误,从而识别重构的潜在站点?

这是一个小的解决方案,不专用于GCC,也会破坏您的构建,但允许您找到您在哪里使用
wchar\u t
。(也或多或少包括第三方代码)

您可以使用预处理器覆盖wchar\t的定义,这将导致使用错误。通过这种方式,您可以找到潜在的用途:

#define wchar_t void

wchar_t Foo() { }

int main()
{
    auto wchar_used = Foo();
}
错误消息:

error: 'void wchar_used' has incomplete type
   10 |     auto wchar_used = Foo();

你现在可以了。微软甚至建议再次使用Win32 API的
A
版本以实现可移植性,不再需要处理
wchar\t
。通过静态链接新的Windows SDK,您甚至可以在旧版本中使用UTF-8语言环境Windows@phuclv代码库很大,已有几十年的历史,必须为某些客户支持某些旧的Windows版本。所以我们还不能切换它。