2011-09-22 7 views
12

Mam trochę starszego kodu, który wymaga podania pewnych flag GCC. Czy mogę dodać sprawdzenia przedprodukcyjne dla tych flag?kompilacja przy błędzie, jeśli nie są wymagane flagi

Na przykład, powiedzmy, że muszę -fno-strict-aliasing, mogę zrobić coś takiego:

#ifndef _FNO_STRICT_ALIASING 
    #error -fno-strict-aliasing is required! 
#endif 
+0

Brzmi jak coś, co powinno być w stanie zrobić. –

+0

@Code Monkey: Oczywiście flaga może być przekazana przez make. Ale jeśli kod źródłowy zostanie przeniesiony do nowego systemu tworzenia, wiedza może zostać utracona (na przykład, jeśli rozprowadzasz źródło do biblioteki). Chcę, żeby sam kod wiedział, czego potrzebuje. W ten sposób jest bardziej SUCHO. :) – paleozogt

Odpowiedz

6

Można użyć

#pragma GCC optimize "no-strict-aliasing" 

skompilować plik z tej flagi (nadrzędne, co zostało określone na wiersz poleceń). Można również użyć

__attribute__((optimize("no-strict-aliasing"))) 

zastosować flagę do jednej funkcji w pliku źródłowym ...

+0

Ah! Nawet lepsze niż to, o co prosiłem! – paleozogt

+0

Byłoby jeszcze lepiej naprawić zepsuty kod, który wymaga tej flagi, tak aby był rzeczywiście prawidłowy C. –

+0

O nie: używanie pragmy z nie-ścisłym aliasingiem nie działa: https://bugzilla.redhat.com/ show_bug.cgi? id = 486176 – paleozogt

3

Jest zdecydowanie nie #define za to, przynajmniej w mojej wersji GCC.

Aby zobaczyć wszystkie predefiniowane symbole preprocesora:

g++ -dM -E - < /dev/null 

Nie sądzę, istnieje jakikolwiek sposób, aby przetestować te opcje. Jeśli jednak korzystasz z GCC 4.4 lub nowszego, możesz użyć opcji "optimize" function attribute lub "optimize" #pragma, aby włączyć określone opcje dla poszczególnych funkcji lub plików.

Na przykład, jeśli dodać do wspólnego pliku nagłówka:

#if defined(__GNUC__) 
#pragma GCC optimize ("no-strict-aliasing") 
#else 
#error "You are not using GCC" 
#endif 

... należy włączyć opcję dla każdego pliku, który zawiera nagłówek.

[aktualizacja]

OK więc zajęło mi około 10 minut zbyt długo, aby skomponować tę odpowiedź. I tak pozostawiam to tutaj dla linków do dokumentów GCC.

+1

O nie: używanie pragmy z no-strict-aliasing nie działa: https://bugzilla.redhat.com/show_bug.cgi ? id = 486176 – paleozogt

Powiązane problemy