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

时间:2014-05-25 18:11:07

标签: c++ c gcc constants

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

#define TEST_DEF 50000U //<- the "U" here
当您不熟悉用于描述问题的术语时,谷歌搜索是徒劳的。

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

我该怎么做呢?它是什么意思?

3 个答案:

答案 0 :(得分:5)

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

  

§6.4.4.1整数常量

定义整数后缀的地方:

  

整数后缀
   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

     

long-suffix:中的一个   l L

     

long-long-suffix:中的一个   ll LL

浮点数的相应后缀为fFlL(适用于floatlong double)。< / p>

请注意,使用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)

并保证该值至少为无符号整数的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的整数常量表达式。对于   例如,如果uint_least64_tunsigned long long int类型的名称,   然后UINT64_C(0x123)可能会扩展为整数常量0x123ULL

答案 1 :(得分:4)

C中有五个整数文字后缀ululllull。与C中几乎所有其他内容不同,它们不区分大小写;此外,ulull可分别写为lullu(但lul不可接受)。

它们控制常量的类型。他们像这样大致

literal │ type
────────┼───────────────────────
500     │ int
500u    │ unsigned int
500l    │ long int
500ul   │ unsigned long int
500ll   │ long long int
500ull  │ unsigned long long int

这只是一个近似值,因为如果常量对于指示的类型来说太大,则会“提升”为更大的类型。对此的规则非常复杂,我不会试图描述它们。 “提升”十六进制和八进制文字的规则与“提升”十进制文字的规则略有不同,它们在C99与C90之间也略有不同,在C ++中也有所不同。

由于促销效果,无法使用这些后缀将常量限制为任何大小。如果您在281474976710656int均为32位宽的系统上编写long,则常量将被赋予long long类型,即使您没有说这样做。此外,没有后缀来强制常量具有类型shortchar。您可以使用[U]INT{8,16,32,64,MAX}_C中的<stdint.h>宏来指示 intent ,但这些宏也不会施加任何上限,并且我可以方便地立即获取所有系统(OSX) ,Linux),*INT8_C*INT16_C实际上会生成类型为(unsigned) int的值。

您的编译器可能,但不是必需的,如果您编写((uint8_t) 512)或类似的(其中512是类型范围之外的编译时常量值),则发出警告。在C11中您可以使用static_assert(来自<assert.h>)强制解决问题但写入可能有点乏味。

答案 2 :(得分:3)

这是一个无符号的文字(U是后缀)。请参阅:http://en.cppreference.com/w/cpp/language/integer_literal