C ++ wchart_t警告:类型

时间:2017-03-26 06:04:42

标签: c++ types wchar-t

//更新1:

代码块16.01
GCC 4.9.2
Windows 10

我想了解:

  1. wchar_t有什么用?
  2. char16_t和wchar_t有什么区别?
    我知道char16_t的大小保证是16位,但在这种特殊情况下它们都是相同的大小。
  3. 每种字符类型的正确文字是什么?
  4. 计划目标:

    • 打印U + 0000到U + FFFF范围内的所有Unicode字符。

    //结束更新1

    编译以下代码时:

    #include <iostream>
    
    int main(void)
    
    {
        std::cout << sizeof(wchar_t) << "\n";
        for (wchar_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
            std::wcout << " " << ch;
    
        std::cout << "\n\n\n";
    }
    

    我收到了以下警告:&#34;字符常量太长,其类型&#34;在for语句的行上。

    我运行了程序,我得到了这个:output

    我在网上搜索了所有我能找到的是wchar_t大小是实现定义的,但即便如此,它在我的系统上是2个字节。我觉得它够大了。

    Q1:为什么我收到警告?
    Q2:为什么输出中有少量字符?我期待成千上万的人。

2 个答案:

答案 0 :(得分:2)

以下可能更符合预期,将每个可打印的代码点从U + 0000显示为U + FFFF作为Unicode。请务必将控制台字体设置为Unicode字体。

#include <cstdlib>
#include <cwctype>
#include <locale>
#include <iostream>

#if _WIN32 || _WIN64
// Windows needs a little non-standard magic for this to work.
#include <io.h>
#include <fcntl.h>
#include <locale.h>
#endif

using std::wint_t;
using std::iswprint;

void init_locale(void)
// Does magic so that wcout can work.
{
#if _WIN32 || _WIN64
  // Windows needs a little non-standard magic.
  constexpr char cp_utf16le[] = ".1200";
  setlocale( LC_ALL, cp_utf16le );
  _setmode( _fileno(stdout), _O_WTEXT );
#else
  // The correct locale name may vary by OS, e.g., "en_US.utf8".
  constexpr char locale_name[] = "";
  std::locale::global(std::locale(locale_name));
  std::wcout.imbue(std::locale());
#endif
}

int main(void)
{
    init_locale();

    for ( unsigned long i = 0; i < 0x10000UL; ++i )
      if (iswprint(static_cast<wint_t>(i)))
        std::wcout << static_cast<wchar_t>(i);

    std::wcout << std::endl;

    return EXIT_SUCCESS;
}

答案 1 :(得分:0)

当我运行此代码时,运行正常:

int main(void)

{
    std::cout << sizeof(char16_t) << "\n";
    for (char16_t ch = u'\u0000'; ch <= u'\uffff'; ++ch)
        std::wcout << " " << static_cast<char>(ch);

    std::cout << "\n\n\n";
}