2016-02-10 11 views
12

Kod snippeed z Android AOSP kod , Sensor.cpp ma poniższy kod.Inicjalizacja struktury w 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, 
}; 

Teraz ja nie rozumiem o co tu robi : oznacza? Czy to inicjalizacja, czy coś innego?

Niewiele wiem o C++. więc jeśli jakikolwiek link lub zasób do zrozumienia tego będzie doceniony. Nie mogłem znaleźć wiele, szukając go w tym celu.

+0

https://isocpp.org/tour ma dobre wprowadzenie do C++. Jest także FAQ i zdecydowanie powinieneś przeczytać podstawowe wskazówki C++ z https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md. – Jens

Odpowiedz

12

Jest to rozszerzenie specyficzne dla kompilatora, przestarzała forma oznaczona inicjatorem. Implementacja gcc jest udokumentowana here.

W C, może być:

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

Z wyznaczonej funkcji inicjatora, wprowadzonego w ISO C99, można napisać to jako:

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

Ale zanim C99, gcc wprowadzono podobny funkcja o innej strukturze:

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

gcc lub dokładniej g ++ wspiera w C++ m jak również, ale C++ nie przyjmuje inicjalizatorów w stylu C99.

Instrukcja gcc mówi, że wersja : tej funkcji była przestarzała od czasu wydania gcc 2.5, która została wydana w 1993 roku, więc zdecydowanie nie powinna być używana w nowym kodzie.

Zauważ, że jeśli wartość początkowa dzieje się małą stałą całkowitą, jak w przykładzie:

version_major: 1, 
    version_minor: 0, 

jej łatwo pomylić ze składnią dla pól bitowych.

Dla C formularz .name = value jest ważny i przenośny, o ile Twój kompilator obsługuje C99 lub nowszy. Dla C++ nie jest to przenośne, ale możesz używać składni C99, dopóki używasz g ++ lub kompilatora takiego jak clang, który jest z nim kompatybilny.