使用gcc使用常量及其关联的修饰符

she*_*lbc 1 c c++ gcc constants

我不知道该怎么称呼这些标志,但我指的是:

#define TEST_DEF 50000U //<- the "U" here
Run Code Online (Sandbox Code Playgroud)

当您不熟悉用于描述问题的术语时,谷歌搜索是徒劳的.

我想要做的是使用这些常量定义并确保该值仅为一定长度,即8位或16位.

我怎么能这样做以及它被称为什么?

Jon*_*ler 5

对于整数,定义这些后缀的标准部分(ISO/IEC 9899:2011 - 又名C2011或C11)是:

§6.4.4.1整数常量

它定义整数后缀的位置:

integer-suffix:
    unsigned-suffix long-suffix opt
     unsigned-suffix long-long-suffix
    long-suffix unsigned-suffix opt
     long-long-suffix unsigned-suffix opt

unsigned-suffix:其中之一
    u U

长后缀:其中之一
    l L

long-long-suffix:其中之一
    ll LL

浮点数相应后缀是f,F,lL(对于floatlong double).

请注意,使用l它是不正确的,因为它太容易混淆1,因此限定符通常用大写字母书写.

如果要创建具有给定大小的整数文字,则执行此操作的工具将标准化<stdint.h>(在C99中添加).

标题(有条件地)定义固定大小的类型,例如int8_tuint16_t.它(无条件地)提供最小尺寸的类型,例如int_least8_tuint_least16_t.如果它不能提供确切的类型(可能因为字大小为36位,因此处理大小为9,18和36),它仍然可以提供最少的类型.

它还提供了诸如INT8_C确保参数是int_least8_t值的宏.

因此,您可以使用:

#include <stdint.h>

#define TEST_DEF UINT16_C(50000)
Run Code Online (Sandbox Code Playgroud)

并且保证该值至少为16位无符号整数,并且格式化/合格.

§7.20.4整数常量的宏

1以下类似函数的宏扩展为整数常量,适用于初始化具有与中定义的类型对应的整数类型的对象<stdint.h>.每个宏名称对应于7.20.1.2或7.20.1.5中的类似类型名称.

2这些宏的任何实例中的参数应为非整数常量(如6.4.4.1中所定义),其值不超过相应类型的限制.

3其中一个宏的每次调用都应扩展为适用于#if预处理指令的整数常量表达式.表达式的类型应与根据整数提升转换的相应类型的表达式具有相同的类型.表达式的值应该是参数的值.

7.20.4.1最小宽度整数常量的宏

1宏INTN_C(value)应扩展为与类型对应的整数常量表达式int_leastN_t.宏UINTN_C(value)应扩展为与类型对应的整数常量表达式uint_leastN_t.例如,if uint_least64_t是类型的名称unsigned long long int,则UINT64_C(0x123)可以扩展为整数常量0x123ULL.