Jedną ważną zaletą implementacji opartej na makrach jest to, że nie jest ona powiązana z żadnym konkretnym typem parametru. Makro funkcyjne w C działa, pod wieloma względami, jako funkcja szablonu w C++ (szablony w C++ narodziły się jako "bardziej cywilizowane" makra, BTW). W tym konkretnym przypadku argument makro nie ma konkretnego rodzaju.Może to być absolutnie wszystko, co można przekształcić na typ unsigned long
. Na przykład, jeśli użytkownik tego wymaga (i jeśli są gotowi zaakceptować konsekwencje zdefiniowane przez implementację), mogą przekazywać typy wskaźników do tego makra.
W każdym razie, muszę przyznać, że to makro nie jest najlepszym przykładem elastyczności makr niezależnych od typu, ale ogólnie rzecz biorąc, elastyczność jest bardzo przydatna. Ponownie, gdy pewna funkcjonalność jest zaimplementowana przez funkcję, jest ona ograniczona do określonych typów parametrów. W wielu przypadkach w celu zastosowania podobnej operacji do różnych typów konieczne jest zapewnienie kilku funkcji z różnymi typami parametrów (i różnymi nazwami, ponieważ jest to C), podczas gdy to samo można zrobić za pomocą tylko jednego makro funkcyjnego. Na przykład, makro
#define ABS(x) ((x) >= 0 ? (x) : -(x))
współpracuje ze wszystkimi typami arytmetycznych, natomiast realizacja funkcji opartych musi dostarczyć sporo z nich (jestem sugerując standardowego abs
, labs
, llabs
i fabs
). (Tak, zdaję sobie sprawę z tradycyjnie wspomnianych niebezpieczeństw związanych z takim makro.)
Makra nie są idealne, ale popularna maksyma dotycząca "makr funkcyjnych, które nie są już potrzebne z powodu funkcji wbudowanych" jest po prostu nonsensem . Aby w pełni zastąpić makra funkcyjne, C będzie potrzebował szablonów funkcji (jak w C++) lub przynajmniej przeciążenia funkcji (jak w C++). Bez tego makra funkcyjne są i nadal będą niezwykle użytecznym narzędziem głównego nurtu w C.
Ponieważ funkcje hashowe idą, to jest dość słabe - ale potem wydaje się, że dane, z którymi ma do czynienia, są również bardzo proste. –
W rzeczywistości nie jest zbyt jasny, aby zrobić to "makro". Funkcja [wbudowana funkcja statyczna] (http://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function) jest prawdopodobnie bardziej odpowiednia. * C * ma wbudowany od 1999 r. I 'gcc' jeszcze wcześniej. To pytanie zostało przytoczone jako powielanie [użycie definicji kfifo] (http://stackoverflow.com/questions/16117304/why-is-kfifo-h-so-full-of-define-statements). Jeśli ** MS-Windows ** jest powodem, dla którego ludzie mówią, że to makro jest uzasadnione, w jaki sposób są one powiązane? –