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.h
wird 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?