Next: , Previous: Storage Layout, Up: Target Macros


17.6 源语言的数据类型布局

这些宏定义了在被编译的程序中使用的标准基础数据类型的大小和其它特征。 不像之前章节中的宏,这些是应用到C和相关语言的特定特征上, 而不是存储布局的基础方面。

— Macro: INT_TYPE_SIZE

一个C表达式,为在target机器上类型int的位大小。 如果没有定义,缺省为一个字。

— Macro: SHORT_TYPE_SIZE

一个C表达式,为在target机器上类型short的位大小。如果没有定义, 缺省为半个字。(如果比一个存储单元小,则会向上舍入为一个单元。)

— Macro: LONG_TYPE_SIZE

一个C表达式,为在target机器上类型long的位大小。 如果没有定义,缺省为一个字。

— Macro: ADA_LONG_TYPE_SIZE

在一些机器上,本地Ada编译器使用的类型long的大小与C使用的不相同。 这种情况下,定义该宏为一个C表达式用于那个类型的大小。如果没有定义, 则缺省为LONG_TYPE_SIZE的值。

— Macro: LONG_LONG_TYPE_SIZE

一个C表达式,为在target机器上类型long long的位大小。如果没有定义, 缺省为两个字。如果你想在你的机器上支持GNU Ada,则该宏的值最少必须为64。

— Macro: CHAR_TYPE_SIZE

一个C表达式,为在target机器上类型char的位大小。 如果没有定义,缺省为BITS_PER_UNIT

— Macro: BOOL_TYPE_SIZE

一个C表达式,为在target机器上C++类型bool和C99类型_Bool的位大小。 如果没有定义,并且通常不会定义,缺省为CHAR_TYPE_SIZE

— Macro: FLOAT_TYPE_SIZE

一个C表达式,为在target机器上类型float的位大小。 如果没有定义,缺省为一个字。

— Macro: DOUBLE_TYPE_SIZE

一个C表达式,为在target机器上类型double的位大小。 如果没有定义,缺省为两个字。

— Macro: LONG_DOUBLE_TYPE_SIZE

一个C表达式,为在target机器上类型long double的位大小。 如果没有定义,缺省为两个字。

— Macro: SHORT_FRACT_TYPE_SIZE

一个C表达式,为在target机器上类型short _Fract的位大小。 如果没有定义,缺省为BITS_PER_UNIT

— Macro: FRACT_TYPE_SIZE

一个C表达式,为在target机器上类型_Fract的位大小。如果没有定义, 缺省为BITS_PER_UNIT * 2

— Macro: LONG_FRACT_TYPE_SIZE

一个C表达式,为在target机器上类型long _Fract的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 4

— Macro: LONG_LONG_FRACT_TYPE_SIZE

一个C表达式,为在target机器上类型long long _Fract的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 8

— Macro: SHORT_ACCUM_TYPE_SIZE

一个C表达式,为在target机器上类型short _Accum的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 2

— Macro: ACCUM_TYPE_SIZE

一个C表达式,为在target机器上类型_Accum的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 4

— Macro: LONG_ACCUM_TYPE_SIZE

一个C表达式,为在target机器上类型long _Accum的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 8

— Macro: LONG_LONG_ACCUM_TYPE_SIZE

一个C表达式,为在target机器上类型long long _Accum的位大小。 如果没有定义,缺省为BITS_PER_UNIT * 16

— Macro: LIBGCC2_LONG_DOUBLE_TYPE_SIZE

定义该宏,如果LONG_DOUBLE_TYPE_SIZE不是常量或者如果你想让libgcc2.a 中具有大小不是LONG_DOUBLE_TYPE_SIZE的程序。如果没有定义, 缺省为LONG_DOUBLE_TYPE_SIZE

— Macro: LIBGCC2_HAS_DF_MODE

定义该宏,如果LIBGCC2_DOUBLE_TYPE_SIZELIBGCC2_LONG_DOUBLE_TYPE_SIZE都不是DFmode, 但是你还想让libgcc2.a中具有DFmode的程序。如果没有定义, 并且LIBGCC2_DOUBLE_TYPE_SIZELIBGCC2_LONG_DOUBLE_TYPE_SIZE为64, 则缺省为1,否则为0。

— Macro: LIBGCC2_HAS_XF_MODE

定义该宏,如果LIBGCC2_LONG_DOUBLE_TYPE_SIZE不是XFmode, 但是你还想让libgcc2.a中具有XFmode的程序。如果没有定义, 并且LIBGCC2_LONG_DOUBLE_TYPE_SIZE为80,则缺省为1,否则为0。

— Macro: LIBGCC2_HAS_TF_MODE

定义该宏,如果LIBGCC2_LONG_DOUBLE_TYPE_SIZE不是TFmode, 但是你还想让libgcc2.a中具有TFmode的程序。如果没有定义, 并且LIBGCC2_LONG_DOUBLE_TYPE_SIZE为128,则缺省为1,否则为0。

— Macro: SF_SIZE
— Macro: DF_SIZE
— Macro: XF_SIZE
— Macro: TF_SIZE

定义这些宏为SFmode, DFmode, XFmodeTFmode值的尾数 位大小,如果在libgcc2.h中的缺省定义不合适。缺省的, FLT_MANT_DIG用于SF_SIZE, LDBL_MANT_DIG用于XF_SIZETF_SIZE,并且DBL_MANT_DIGLDBL_MANT_DIG用于 DF_SIZE,根据LIBGCC2_DOUBLE_TYPE_SIZELIBGCC2_LONG_DOUBLE_TYPE_SIZE是否为64。

— Macro: TARGET_FLT_EVAL_METHOD

一个C表达式,为float.h中的FLT_EVAL_METHOD的值。 如果没有定义,则FLT_EVAL_METHOD的值将为0。

— Macro: WIDEST_HARDWARE_FP_SIZE

一个C表达式,为硬件支持的最宽浮点格式的位数。如果定义该宏, 则必须指定一个小于或等于LONG_DOUBLE_TYPE_SIZE的值。如果没有定义, 则缺省为LONG_DOUBLE_TYPE_SIZE的值。

— Macro: DEFAULT_SIGNED_CHAR

一个表达式,其值为1或者0,根据类型char缺省应该为有符号的还是无符号的。 用户总是可以使用选项-fsigned-char-funsigned-char来覆盖该缺省定义。

— Target Hook: bool TARGET_DEFAULT_SHORT_ENUMS (void)

该target钩子应该返回真,如果编译器应该为enum类型设置为可以表示该类型值 范围的字节数。其应该返回假,如果所有的enum类型应该按照int类型的 方式来分配。

缺省为返回假。

— Macro: SIZE_TYPE

一个C表达式,为一个字符串描述了用于size值的数据类型名。 typedef名size_t使用该字符串的内容来定义。

字符串可以包含多一个的关键字。如果是这样,则将它们使用空格分开, 首先是任意长度的关键字,然后是合适unsigned 的,最后是int。 字符串必须显示的匹配文件c-decl.c中函数init_decl_processing中 定义的数据类型名。不可以省略掉int或者改变顺序, 这将会使编译器在启动时崩溃。

如果没有定义,缺省为"long unsigned int"

— Macro: PTRDIFF_TYPE

一个C表达式,为一个字符串,描述了用于两个指针相减的结果的数据类型名。 typedef名ptrdiff_t使用该字符串的内容来定义。更多信息, 参见上面的SIZE_TYPE

如果没有定义,则缺省为"long int"

— Macro: WCHAR_TYPE

一个C表达式,为一个字符串,描述了用于宽字符的数据类型名。 typedef名wchar_t使用该字符串的内容来定义。更多信息, 参见上面的SIZE_TYPE

如果没有定义,则缺省为"int"

— Macro: WCHAR_TYPE_SIZE

一个C表达式,为宽字符数据类型的位数。 这用于不能使用WCHAR_TYPEcpp中。

— Macro: WINT_TYPE

一个C表达式,为一个字符串, 描述了传递给printf并且从getwc中返回的宽字符数据类型名。 typedef名wint_t使用该字符串的内容来定义。更多信息, 参见上面的SIZE_TYPE

如果没有定义,则缺省为"unsigned int"

— Macro: INTMAX_TYPE

一个C表达式,为一个字符串, 描述了可以表示任何标准或者扩展的有符号整数类型值的数据类型名。 typedef名intmax_t使用该字符串的内容来定义。更多信息, 参见上面的SIZE_TYPE

如果没有定义,则缺省为"int", "long int""long long int"中第一个与long long int具有相同精度的字符串。

— Macro: UINTMAX_TYPE

一个C表达式,为一个字符串, 描述了可以表示任何标准或者扩展的无符号整数类型值的数据类型名。 typedef名uintmax_t使用该字符串的内容来定义。更多信息, 参见上面的SIZE_TYPE

如果没有定义,则缺省为"unsigned int", "long unsigned int""long long unsigned int"中第一个与long long unsigned int 具有相同精度的字符串。

— Macro: SIG_ATOMIC_TYPE
— Macro: INT8_TYPE
— Macro: INT16_TYPE
— Macro: INT32_TYPE
— Macro: INT64_TYPE
— Macro: UINT8_TYPE
— Macro: UINT16_TYPE
— Macro: UINT32_TYPE
— Macro: UINT64_TYPE
— Macro: INT_LEAST8_TYPE
— Macro: INT_LEAST16_TYPE
— Macro: INT_LEAST32_TYPE
— Macro: INT_LEAST64_TYPE
— Macro: UINT_LEAST8_TYPE
— Macro: UINT_LEAST16_TYPE
— Macro: UINT_LEAST32_TYPE
— Macro: UINT_LEAST64_TYPE
— Macro: INT_FAST8_TYPE
— Macro: INT_FAST16_TYPE
— Macro: INT_FAST32_TYPE
— Macro: INT_FAST64_TYPE
— Macro: UINT_FAST8_TYPE
— Macro: UINT_FAST16_TYPE
— Macro: UINT_FAST32_TYPE
— Macro: UINT_FAST64_TYPE
— Macro: INTPTR_TYPE
— Macro: UINTPTR_TYPE

C expressions for the standard types sig_atomic_t, int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, int_least8_t, int_least16_t, int_least32_t, int_least64_t, uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t, int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t, intptr_t, and uintptr_t. See SIZE_TYPE above for more information.

If any of these macros evaluates to a null pointer, the corresponding type is not supported; if GCC is configured to provide <stdint.h> in such a case, the header provided may not conform to C99, depending on the type in question. The defaults for all of these macros are null pointers.

— Macro: TARGET_PTRMEMFUNC_VBIT_LOCATION

The C++ compiler represents a pointer-to-member-function with a struct that looks like:

            struct {
              union {
                void (*fn)();
                ptrdiff_t vtable_index;
              };
              ptrdiff_t delta;
            };

The C++ compiler must use one bit to indicate whether the function that will be called through a pointer-to-member-function is virtual. Normally, we assume that the low-order bit of a function pointer must always be zero. Then, by ensuring that the vtable_index is odd, we can distinguish which variant of the union is in use. But, on some platforms function pointers can be odd, and so this doesn't work. In that case, we use the low-order bit of the delta field, and shift the remainder of the delta field to the left.

GCC will automatically make the right selection about where to store this bit using the FUNCTION_BOUNDARY setting for your platform. However, some platforms such as ARM/Thumb have FUNCTION_BOUNDARY set such that functions always start at even addresses, but the lowest bit of pointers to functions indicate whether the function at that address is in ARM or Thumb mode. If this is the case of your architecture, you should define this macro to ptrmemfunc_vbit_in_delta.

In general, you should not have to define this macro. On architectures in which function addresses are always even, according to FUNCTION_BOUNDARY, GCC will automatically define this macro to ptrmemfunc_vbit_in_pfn.

— Macro: TARGET_VTABLE_USES_DESCRIPTORS

Normally, the C++ compiler uses function pointers in vtables. This macro allows the target to change to use “function descriptors” instead. Function descriptors are found on targets for whom a function pointer is actually a small data structure. Normally the data structure consists of the actual code address plus a data pointer to which the function's data is relative.

If vtables are used, the value of this macro should be the number of words that the function descriptor occupies.

— Macro: TARGET_VTABLE_ENTRY_ALIGN

By default, the vtable entries are void pointers, the so the alignment is the same as pointer alignment. The value of this macro specifies the alignment of the vtable entry in bits. It should be defined only when special alignment is necessary. */

— Macro: TARGET_VTABLE_DATA_ENTRY_DISTANCE

There are a few non-descriptor entries in the vtable at offsets below zero. If these entries must be padded (say, to preserve the alignment specified by TARGET_VTABLE_ENTRY_ALIGN), set this to the number of words in each data entry.