2012-12-31 9 views
8

GCC posiada opcję, -fms-extensions, które pozwalają na korzystanie z anonimowych członków struct:Czy używanie GCC -fms-extensions jest złym pomysłem?

struct a { 
    int x; 
} 

struct b { 
    int y; 
    struct a; 
} 

ta umożliwia dostęp elementu x w struct b po prostu za pomocą b.x. Jest to niezwykle przydatne, ale wydaje się, że jest to rozszerzenie Microsoft emulowane przez GCC.

Czy użycie tej opcji spowoduje, że mój kod stanie się mniej przenośny, czy też jest uważany za "bezpieczny" w użyciu?

+0

IMHO, to nie jest tak przydatne. Nie tak bardzo, aby kod zależał od gcc. Tak więc odpowiedź brzmi: tak. – Jack

Odpowiedz

13

Jeśli szukasz kompatybilności, to nigdy nie jest dobry pomysł, aby ustawić opcje kompilatora luźne, ostrzejsze - bardziej przenośny

4

Flaga -fms-extensions służy do „Akceptuj jakieś nietypowe konstrukcje wykorzystywane w Pliki nagłówkowe Microsoft. ". GCC jest potężny, ponieważ jest tworzony dla różnych standardów, więc nie sądzę, że jest to zły pomysł, aby użyć go w odpowiednich okolicznościach.

+1

(O ile oczywiście piszesz nowy kod i możesz chcieć skierować go do innego kompilatora!) –

+1

Jest to * okropny * pomysł, aby go użyć, jeśli absolutnie nie * potrzebujesz *, aby go użyć. Ta opcja jest dostępna, jeśli jej potrzebujesz - nic więcej. – paulsm4

6

Biorąc pod uwagę, że funkcja, która wydaje się odpowiednikiem, zwana anonimowymi strukturami i związkami, została dodana do C w wersji 2011 standardu (C11), powiedziałbym, że używanie tej funkcji nie jest złym pomysłem. Kompilatory MS obsługują to, kompilatory kompatybilne z GCC i "GNU C" obsługują je, o co proszą, a nowe kompilatory zgodne z nowoczesnym standardem obsługują to.

+1

W tym przypadku jednak, _nitpicky_ sposób włączania tej obsługi w gcc byłoby nazywanie '-std = c11' lub' -std = iso9899: 2011' (zgodnie z dokumentacją gcc, http://gcc.gnu.org /onlinedocs/gcc/Standards.html) - nie przez specjalną flagę kompilatora. –

+0

Niestety, wiele starszych wersji gcc nie rozpoznaje '-std = c11' (ponieważ * nie było C11 * kiedy zostały wydane), ale nadal akceptuje anonimowe struktury/związki jako rozszerzenie. Jeśli więc chcesz, aby twoje oprogramowanie nie zależało od bardzo niedawnego gcc, powinieneś się upewnić, że łatwo jest skompilować je z flagami, które sprawiają, że działa również na starszych. –

Powiązane problemy