2013-10-04 9 views
7

Mam istniejącego kodu w C:static inicjalizacji tablicy char w stałej struktury z C do C++

extern const struct sockaddr_un addr = 
{ 
    .sun_family = AF_UNIX, 
    .sun_path = "myreallylongpath" 
}; 

Gdzie sun_path jest tablicę znaków.

Używane do kompilacji dobrze jako C w starszej wersji GCC. Przekształciłem go teraz w C++ i używam GCC v4.7.2. Wciąż otrzymuję błąd:

"C99 designator 'sun_path' outside aggregate intializer"

Czy nie jest możliwe, aby robić to, co robię w C++ lub jest składnia różni się od starego C?

+1

Jeśli konwersja cały kod w C++, należy rozważyć dodanie konstruktora sockaddr_un i wykorzystanie go do tworzenia instancji. –

+0

@NeilKirk: To jest struktura ze standardowego API POSIX C. Nie możesz dodać do niego konstruktora (możesz dodać nazwany konstruktor, ale nie sądzę, że ma to sens). –

Odpowiedz

11

Wyznaczone inicjalizatory zostały wprowadzone w C99, GCC obsługuje je także jako rozszerzenie w GNU89, ale nie w C++.

Musisz więc użyć stylu C89, który jest również obsługiwany w C++. Ponieważ struktura ma tylko te dwa pola:

extern const struct sockaddr_un addr = 
{ 
    AF_UNIX, 
    "myreallylongpath" 
}; 

referencyjny: Designated Initializers

+0

Wadą jest to, że jeśli ta struktura biblioteki ulegnie zmianie, otrzymamy błędne dane w niewłaściwych miejscach. Pamiętajcie, że jeśli zmienią tę definicję, to i tak pewnie "złamie świat". :-P – Joe

+2

@Joe: Jest to standardowy interfejs ze specyfikacji POSIX. Nie zmieniło się przez 40 lat i nie może się zmienić bez spowodowania upadku nieba. W tym konkretnym przypadku na pewno nie martwiłbym się o to. –