Gibt es im C-Standard irgendwelche Einschränkungen, die die Implementierung von Funktionen als Makros erlauben?

Zusätzlich zu einer Funktionsdeklaration stellen C-Standard-Header häufig ein "Maskierungsmakro" bereit, um die Dinge schneller zu machen. Zum Beispiel, wenn ich einschließectype.hwird die Header-Datei deklariert

int isdigit(int c);

Es kann aber auch die Deklaration mit einem Makro maskieren. Ich glaube das ist ein portablesisdigit Makro nach dem C-Standard:

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

Natürlich ist dieses Makro auch gefährlich, weil es undefiniertes Verhalten hervorruft, wenn Sie dies tun, während das Makro definiert ist:

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

Um UB in diesem hypothetischen Fall zu vermeiden, muss ich den Funktionsnamen mit Parens umgeben:(isdigit)(c++). Meine Frage lautet also: Gibt es Einschränkungen für welche Art von Maskierungsmakros ein Standardheader definieren kann? Verursachen sie garantiert kein undefiniertes Verhalten, wenn ein Argumentausdruck Nebenwirkungen hat, oder dürfen sie technisch seltsames Verhalten haben, wie wir es oben sehen? Wo sind die Grenzen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage