Makro wielkości tablicy, które odrzuca wskaźniki

Często uczonym makrem o standardowym rozmiarze tablicy jest

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))

lub jakaś równoważna formacja. Jednak tego rodzaju działanie po cichu kończy się powodzeniem, gdy wskaźnik jest przekazywany, i daje wyniki, które mogą wydawać się wiarygodne w czasie wykonywania, dopóki rzeczy w tajemniczy sposób się nie rozpadną.

Zbyt łatwo jest popełnić ten błąd: funkcja z lokalną zmienną tablicową jest refaktoryzowana, przenosząc trochę manipulacji tablicą do nowej funkcji wywoływanej z tablicą jako parametre

Tak więc pytanie brzmi: czy istnieje makro „sanitarne” do wykrywania niewłaściwego użyciaARRAYSIZE makro w C, najlepiej w czasie kompilacji? W C ++ użyjemy szablonu wyspecjalizowanego tylko dla argumentów tablicowych; w C wydaje się, że potrzebujemy sposobu na rozróżnienie tablic i wskaźników. (Na przykład, gdybym chciał odrzucić tablice, zrobiłbym np.(arr=arr, ...), ponieważ przypisanie tablicy jest nielegalne).

questionAnswers(9)

yourAnswerToTheQuestion