Oracle® Developer Studio 12.5:C++ 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

4.11 支持的属性

支持以下属性:为了实现兼容,编译器会实现由 __attribute__ (( keyword))[[keyword]] 调用的以下属性。还接受在双下划线内拼写的属性关键字 __keyword__

aligned

大致等效于 #pragma align。生成警告,且在用于可变长度数组时会被忽略。

always_inline

#pragma inline-xinline 等效

const

#pragma no_side_effect 等效

constructor

#pragma init 等效

deprecated(msg)

如果在源文件中使用类型、变量或函数,则会导致发出警告。可选参数 msg 必须是一个字符串文字,并将包括在警告消息中。

destructor

#pragma fini 等效

malloc

#pragma returns_new_memory 等效

mode

(无等效子句)

noinline

#pragma no_inline-xinline 等效

noreturn

#pragma does_not_return 等效

pure

#pragma does_not_write_global_data 等效

packed

#pragma pack() 等效。请参见下面的详细信息。

returns_twice

#pragma unknown_control_flow 等效

strong

接受它是为了与 g++ 兼容,但不起任何作用。g++ 文档建议不要使用该属性。

tls_model

设置线程局部存储模型。tls_model 参数应为以下值之一:global-dynamiclocal-dynamicinitial-execlocal-exec

vector_size

指示变量或类型名称(使用 typedef 创建)表示一个向量。

visibility

提供链接程序作用域。(请参见 -xldscope={v})语法为:__attribute__((visibility(“visibility-type”))),其中 visibility-type 是以下选项之一:

default

__global 链接程序作用域相同

hidden

__hidden 链接程序作用域相同

internal

__symbolic 链接程序作用域相同

weak

#pragma weak 等效

4.11.1 __has_attribute 函数式宏

预定义的函数式宏。

__has_attribute(attr)

如果 attr 是支持的属性,计算结果为 1。否则,计算结果为 0。用法示例:

#ifndef __has_attribute // if we don't have __has_attribute, ignore it
    #define __has_attribute(x) 0
#endif
#if __has_attribute(deprecated)
   #define DEPRECATED __attribute__((deprecated))
#else
   #define DEPRECATED // attribute "deprecated" not available
#endif
void DEPRECATED old_func(int); // use the attribute if available

4.11.2 __packed__ 属性详细信息

此属性附加于 structunion 类型定义中,它指定结构或联合的每个成员(除了零宽度位字段)的放置,以最大限度地减小所需内存。附加于 enum 定义时,__packed__ 指示应使用最小的整数类型。

structunion 类型指定此属性等效于对每个结构或联合成员指定 packed 属性。

在以下示例中,struct my_packed_struct 的成员紧紧打包在一起,但其成员的内部布局并不打包。为此,还需要打包 struct my_unpacked_struct

struct my_unpacked_struct
{
   char c;
   int i;
;
              
struct __attribute__ ((__packed__)) my_packed_struct
{
   char c;
   int  i;
   struct my_unpacked_struct s;
};

只能对 enumstructunion 的定义指定此属性,不能对未定义枚举类型、结构或联合的 typedef 指定此属性。