Rozważmy następujący C programu (Ignore podwójnego efektów ubocznych wydania)Makro ekspansja makra z argumentami vs. zmiennych o tej samej nazwie
#define max(a, b) (a>b?a:b)
int main(void){
int max = max(5,6);
return max;
}
Preprocesor GCC zamienia to na:
int main(void){
int max = (5>6?5:6);
return max;
}
Co jest całkiem miłe, ponieważ nie musisz się martwić niezamierzonymi kolizjami między max
a max()
. GCC manual mówi:
Makro podobne do funkcji jest rozszerzane tylko wtedy, gdy jego nazwa pojawia się z parą nawiasów po nim. Jeśli napiszesz tylko imię i nazwisko, zostaje ono pozostawione samo sobie
Czy to jest standaryzowane, czy po prostu wykonane według konwencji?
Jestem zdezorientowany. Wygląda na to, że gcc uznał makra max, a zamiast tego wywołał prawdziwą funkcję max. – octopusgrabbus
@octopusgrabbus: Jaka funkcja "max"? –
Znaleziono odpowiednią część w podręczniku GCC, ale nadal nie wiem, czy jest to standaryzacja, czy tylko nieformalna konwencja. – mensi