Jeśli Foo
jest niezdefiniowany, to ten ostatni przełoży się
#if 0 - 0 == 0
która prawda, nie fałszywe. Pamiętaj, że pod #if
wszystkie niezdefiniowane identyfikatory są zamieniane na literalne 0
(gdy wszystkie operatory defined()
są oceniane, oczywiście). Dotyczy to nawet żetonów preprocessingu, które pasują do słów kluczowych w języku. W języku C wszystkie słowa kluczowe są zamieniane na 0
w tym kontekście. W C++ słowa kluczowe true
i false
są zwolnione z wymiany, a wszystkie inne słowa kluczowe są zastępowane.
(okazji, co oznacza, że w C true
będzie spokojnie zastąpiony 0
jeśli <stdbool.h>
nie jest włączone, i 1
jeśli <stdbool.h>
jest włączone).
Tymczasem
#if defined(Foo) && Foo == 0
fałszywe gdy Foo
jest niezdefiniowany. Oto twoja różnica.
Dokumentacja Qt rzeczywiście sugeruje, że ta pierwsza jest taka sama jak ta druga. Nie wiem, dlaczego to robią, ponieważ z pewnością nie są one równoważne. Wydaje się, że jest to błąd w dokumentach Qt.
Więc jest błąd w dokumentach Qt!"po ich wyjaśnieniu okazało się, że te dwa są równe – Hate
+1 dla" wszystkie niezdefiniowane identyfikatory są zamieniane na literalne 0' – billz
@billz i AndreyT czy możesz podzielić się ze mną kilkoma linkami lub poradami na temat makr w C++? Ponieważ to, co znalazłem na ich temat, to tylko ich lista i krótki opis, ale z pewnością nie czytałem w żadnym miejscu, np. "Wszystkie niezdefiniowane identyfikatory zostały zastąpione literalnym 0". – Hate