Насколько велика wchar_t с GCC? - PullRequest
13 голосов
/ 02 февраля 2011

GCC поддерживает -fshort-wchar, который переключает wchar_t с 4 на два байта.

Каков наилучший способ определения размера wchar_t во время компиляции, поэтому я могу правильно сопоставить его с соответствующим utf-16 или тип utf-32?По крайней мере, до тех пор, пока c ++ 0x не будет выпущен и даст нам стабильные utf16_t и utf_32_t typedefs.

#if ?what_goes_here?
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
#else
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
#endif

Ответы [ 6 ]

12 голосов
/ 02 февраля 2011

Вы можете использовать макросы

__WCHAR_MAX__
__WCHAR_TYPE__

Они определены gcc.Вы можете проверить их значение с помощью echo "" | gcc -E - -dM

Поскольку значение __WCHAR_TYPE__ может варьироваться от int до short unsigned int или long int, лучше всего для ИМХО проверять, если __WCHAR_MAX__выше 2 ^ 16.

#if __WCHAR_MAX__ > 0x10000
  typedef ...
#endif
10 голосов
/ 02 февраля 2011
template<int>
struct blah;

template<>
struct blah<4> {
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
};

template<>
struct blah<2> {
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
};

typedef blah<sizeof(wchar_t)>::Utf16 Utf16;
typedef blah<sizeof(wchar_t)>::Utf32 Utf32;
4 голосов
/ 27 марта 2012

Вы можете использовать стандартный макрос: WCHAR_MAX:

#include <wchar.h>
#if WCHAR_MAX > 0xFFFFu
// ...
#endif

WCHAR_MAX Макрос определен в соответствии со стандартами ISO C и ISO C ++ (см.: ISO / IEC 9899 - 7.18.3 Пределы других целочисленных типов и ISO / IEC 14882 - C.2), чтобы вы могли безопасно использовать его почти на всех компиляторах.

2 голосов
/ 26 июня 2017

Размер зависит от флага компилятора -fshort-wchar:

g++ -E -dD -fshort-wchar -xc++ /dev/null | grep WCHAR
#define __WCHAR_TYPE__ short unsigned int
#define __WCHAR_MAX__ 0xffff
#define __WCHAR_MIN__ 0
#define __WCHAR_UNSIGNED__ 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 2
#define __ARM_SIZEOF_WCHAR_T 4
2 голосов
/ 02 февраля 2011

Как сказал Лютер Блиссетт, wchar_t существует независимо от Unicode - это две разные вещи.

Если вы действительно говорите о UTF-16 - учтите, что есть символы Unicode, которые отображаются на два 16-битныхслова (U + 10000..U + 10FFFF, хотя они редко используются в западных странах / языках).

1 голос
/ 27 августа 2015
$ g++ -E -dD -xc++ /dev/null | grep WCHAR
#define __WCHAR_TYPE__ int
#define __WCHAR_MAX__ 2147483647
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...