Być może spróbuj kilkuetapowej ekspansji makr? Jest to strategia używana przez Boost preprocessor/control/if library.
Nie sądzę, że istnieje sposób sprawdzenia warunków w rozszerzeniu makr C.
Najlepszą rzeczą jaką mogę wymyślić jest zamienienie argumentów makra na literał łańcuchowy za pomocą operatora naciągania #
, a następnie sprawdzenie za pomocą funkcji wykonawczych. (To nie będzie działać w Twoim przypadku, chociaż, gdzie chcesz deklaracji zmiennych wyjściowych.)
na przykład następujące drukuje „011”:
#define FOO(x) (strcmp("NAME", #x) ? 1 : 0)
main()
{
printf("%d", FOO(NAME));
printf("%d", FOO(1));
printf("%d", FOO(2));
}
Kompilator najprawdopodobniej optymalizacji strcmp
porównań podczas kompilacji, więc nie byłoby to bardziej nieefektywne, niż gdyby dostępne były prawdziwe warunki wstępne procesora. Jednak wykonanie normalnej funkcji byłoby bardziej przejrzyste i prawdopodobnie równie skuteczne.
Makra są niesamowite. –
Czy możesz wyjaśnić cel, a może dać lepszy przykład? Parametr musiałby zostać ustalony w czasie kompilacji, co oznacza, że równie dobrze można użyć dwóch różnych nazw makr. – lurker
@mbratch: W tym konkretnym przypadku używam makra do zdefiniowania zestawu zmiennych, ale niektóre zmienne są opcjonalne i chcę uniknąć ich definiowania. Wiele nazw makr nie działałoby dobrze ze względu na kombinatoryczną eksplozję: przy dwóch nazwach zmiennych potrzebowałbym osobnych makr dla 'foo (a, b)', 'foo (a, _)', 'foo (_, b)' oraz ' foo (_, _) '. – hugomg