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__ 属性の詳細

struct または union の型定義に添付されるこの属性は、必要なメモリーを最小限に抑えるために、構造体または共用体の各メンバー (幅が 0 のビットフィールドを除く) の配置を指定します。enum 定義に添付する場合は、__packed__ は最小の整数型を使用すべきことを示します。

struct および union 型に対してこの属性を指定する場合は、構造体または共用体の各メンバーに対して 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;
};

この属性を指定できるのは、enumstruct、または union の定義のみです。列挙型、構造体、共用体のいずれも定義しない typedef に対して、この属性は指定できません。