2016-02-10 33 views
12

コードスニペットAndroid AOSPコード から、Sensor.cppには以下のコードがあります。C++での構造体の初期化

struct sensors_module_t HAL_MODULE_INFO_SYM = { 
    common: { 
     tag: HARDWARE_MODULE_TAG, 
     version_major: 1, 
     version_minor: 0, 
     id: SENSORS_HARDWARE_MODULE_ID, 
     name: "LGE Sensor module", 
     author: "LG Electronics Inc.", 
     methods: &sensors_module_methods, 
     dso: NULL, 
     reserved: {0} 
    }, 
    get_sensors_list: sensors__get_sensors_list, 
}; 

ここで理解していないのは、:はここですか?何らかの初期化や何か他のものですか?

C++についてよくわかりません。このようなことを理解するためのリンクやリソースがあれば歓迎します。私はこれでグーグルで多く見つけることができませんでした。

+0

https://isocpp.org/tourには、C++の紹介があります。 FAQもありますので、C++のコアガイドラインはhttps://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.mdから必ず読んでください。 – Jens

答えて

12

これは、コンパイラ固有の拡張子で、という指定された初期化子の廃止された形式です。 gccの実装については、hereと記載されています。

持つCでは、あなたは可能性がある:ISO C99で導入された指定イニシャライザの特徴に

struct point { int x, y; }; 
struct point p = { 10, 20 }; 

を、あなたはこれを書くことができます。

struct point { int x, y; }; 
struct point p = { .x = 10, .y = 20 }; 

しかし、C99の前に、GCCは同様のを導入しました

struct point { int x, y; }; 
struct point p = { x: 10, y: 20 }; 

gcc、より正確にはg ++、これはC++でサポートされていますm odeもC++はC99スタイルのイニシャライザを採用していません。

この機能の:バージョンは、1993年にリリースされたgcc 2.5以降で廃止されているため、新しいコードでは使用しないでください。

なお、初期値はあなたの例のように、小さな整数の定数であることを起こる場合:

version_major: 1, 
    version_minor: 0, 

ビットフィールドの構文とその簡単に混乱。

Cの場合、.name = valueフォームは、コンパイラがC99以降をサポートしている限り、有効で移植性があります。 C++の場合、移植性がありませんが、g ++や互換性のあるclangのようなコンパイラを使用している限り、C99構文を使用できます。

関連する問題