Расширение макросов для макросов с аргументами и переменных с одинаковыми именами

Рассмотрим следующую программу 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сказано:

Функционально-подобный макрос раскрывается только в том случае, если его имя стоит с парой скобок после него. Если вы пишете только имя, оно остается в покое.

Это стандартизировано или это сделано по соглашению?

5
задан Brian Tompsett - 汤莱恩 15 April 2016 в 14:57
поделиться