Czy są jakieś ograniczenia dotyczące standardu C, pozwalające na implementację funkcji jako makr?

Często oprócz dostarczenia deklaracji funkcji, standardowe nagłówki C mogą dostarczyć „makro maskowania”, aby przyspieszyć działanie. Na przykład, jeśli uwzględnięctype.h, plik nagłówkowy zadeklaruje

int isdigit(int c);

Ale może również maskować deklarację za pomocą makra. Wierzę, że to przenośne urządzenieisdigit makro zgodnie ze standardem C:

#define isdigit(c) ((c) >= '0' && (c) <= '9')

Oczywiście to makro jest również niebezpieczne, ponieważ wprowadza niezdefiniowane zachowanie, jeśli zrobisz to, gdy makro jest zdefiniowane:

int c = 'A';
printf("%d\n", isdigit(c++));

Aby uniknąć UB w tym hipotetycznym przypadku, muszę otoczyć nazwę funkcji parens:(isdigit)(c++). Tak więc moje pytanie brzmi: czy istnieją jakieś ograniczenia dotyczące tego, jaki rodzaj maskowania makr może zdefiniować standardowy nagłówek? Czy mają gwarancję, że nie spowodują niezdefiniowanego zachowania, jeśli wyrażenie argumentu ma skutki uboczne, czy też technicznie mogą mieć dziwne zachowania, takie jak powyżej? Gdzie są granice?

questionAnswers(2)

yourAnswerToTheQuestion