gpt4 book ai didi

c - static_assert 宽字 rune 字的符号?

转载 作者:太空狗 更新时间:2023-10-29 16:11:00 25 4
gpt4 key购买 nike

我想 static_assert() 宽字 rune 字 ( L'x' ) 的符号与 wchar_t 的符号匹配.

wchar_t的定义是我自己的。 (我正在实现一个 C 标准库。)如果用户使用的编译器对宽字符符号的理解与库中配置的不同,我希望尽早失败,大声失败。

断言类型的匹配大小很容易:

static_assert( sizeof( wchar_t ) == sizeof( L'x' ), "size matches" );

对于内置类型 char ,测试签名很容易。假设有一个 _CHAR_IS_SIGNED在某处定义为 0 或 1,

static_assert( ( (char)-1 < 0 ) == _CHAR_IS_SIGNED, "char is signed" );

成功了。

但是wchar_t 不是内置类型...

有没有办法在“纯”C99 或 C11 中进行此(静态)断言,即不依赖特定编译器的扩展?


澄清:

我"is"图书馆。我必须 typedef一些整数类型为 wchar_t .

编译器——不是我——为某种类型定义了宽字 rune 字。此类型由编译器分配名称,但理想情况下应与我为 wchar_t 使用的名称相同,包括签名(标准未指定 AFAICT)。

我想以某种方式断言/测试这些类型的身份。 (type)-1 < 0检查显示 char以上不起作用,因为我无法命名“编译器用于文字的类型”

最佳答案

您甚至不需要检查编译器是否对宽字 rune 字使用有符号或无符号类型。

您可以简单地测试一种宽字 rune 字是否与您的 typedef 匹配:

static_assert(_Generic(L'.', wchar_t : 1, default : 0), "blahblah");

但是如果你真的想获得类型签名,使用这样的东西:

static_assert(_Generic(L'.', char : ((char)-1 < 0), signed char : 1, short : 1, int : 1, long : 1, long long : 1, default : 0) == _WIDE_CHAR_IS_SIGNED, "blahblah");

而且(正如@chux 所建议的)这是一个更安全的版本,如果宽字符类型与任何标准字符类型都不匹配,它会强制出现编译错误。

#define T(x) signed x : 1, unsigned x : 0 // Makes the code more readable
static_assert(_Generic(L'.', char : ((char)-1 < 0), T(char), T(short), T(int), T(long), T(long long)) == _WIDE_CHAR_IS_SIGNED, "blahblah");
#undef T

关于c - static_assert 宽字 rune 字的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36013635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com