Рассмотрим следующую программу C(не обращая внимания на проблему двойного побочного эффекта):
#define max(a, b) (a>b?a:b)
int main(void){
int max = max(5,6);
return max;
}
Препроцессор GCC преобразует это в:
int main(void){
int max = (5>6?5:6);
return max;
}
Что такое довольно приятно, так как вам не нужно беспокоиться о непреднамеренных коллизиях между max
и max()
. В руководстве GCCсказано:
Функционально-подобный макрос раскрывается только в том случае, если его имя стоит с парой скобок после него. Если вы пишете только имя, оно остается в покое.
Это стандартизировано или это сделано по соглашению?