2013-08-08 9 views
9

Naszym C/C++ projektu używamy nagłówka konfiguracji (~ 1000 linii), który jest pełen # ifdef i #definesAlternatywy/Narzędzia dla #define piekła C/C++

#if (defined(HW_1) || defined(SOME_TECHNOLOGY_SUPPORTED)) && defined(OTHER_TECHNOLOGY_SUPPORTED) 
#define SOME_FEATURE_AVAILABLE 
#endif 

W naszej konfiguracji kompilacji mamy predefiniuj niektóre definicje, które są przekazywane do kompilatora. Powoduje to różne definicje (np. SOME_FEATURE_AVEILABLE) w naszym nagłówku konfiguracji.

Ponieważ nasz nagłówek konfiguracji jest dość duży, jest też trochę bałaganu.

Czy są jakieś alternatywy dla tego piekła #define?

Czy są jakieś narzędzia, które pomagają zobaczyć, w jakim przypadku są zdefiniowane.

Rozwijamy wbudowane oprogramowanie układowe, więc nie możemy zastąpić warunkowej kompilacji przez środowisko wykonawcze.

+2

Na którym systemie się kompilujesz. Dla którego systemu operacyjnego? Poszukaj 'autoconf' i' autotools' ... –

+2

Jeśli będziesz trzymać się ANSI C89 i ISO C++ 98, nie potrzebujesz żadnego z nich. –

+0

Nadal kompilator może być w stanie zoptymalizować, jeśli warunkowe, jeśli zdefiniujesz statyczne const booleans. – Frodo

Odpowiedz

1

Jeśli wszystkie twoje #define są w jednym pliku konfiguracyjnym, możesz spróbować zrobić kompilację tylko dla preprocesorów, a następnie znaleźć wszystkie zdefiniowane makra. Np

$ gcc -DFEATURE1 -DFEATURE2 -E configuration.h | grep '#define' 
1

Możecie chcą czytać o polityce i rozważyć projekt oparty na C++ (http://en.wikipedia.org/wiki/Policy-based_design) wprowadzone przez Alexandrescu w jego książce „Modern C++ projektu”.

+0

Preferuję wzór "mostu" do projektowania opartego na zasadach: osiąga ten sam cel bez szablonów i dziedziczenia. – Michael

+0

Podejrzewam, że most powoduje pewne obciążenie środowiska wykonawczego (?). Projektowanie oparte na regułach (za pomocą szablonów) nie jest. Wielokrotna inheriancja nie powoduje tutaj problemów, ponieważ nie traktujemy obiektów jako obiektu klasy podstawowej (nie traktuj ich polimorficznie). – JohnB