2013-01-04 23 views

Odpowiedz

20

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.

+0

Więc jest błąd w dokumentach Qt!"po ich wyjaśnieniu okazało się, że te dwa są równe – Hate

+5

+1 dla" wszystkie niezdefiniowane identyfikatory są zamieniane na literalne 0' – billz

+0

@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

1

Różnica Foo == 0 i Foo - 0 == 0 oznacza, że ​​w pierwszym, Foo musi być określona wartość:

#define Foo 0 

i nie mogą być:

#define Foo // Foo == 0 would give an error, cannot evaluate Foo 

While w przypadku Foo - 0 == 0, Foo można zdefiniować bez wartości

sposób:

#if defined(Foo) && Foo == 0 

Oznacza definicję Foo i ma wartość (w tym przypadku 0).

oraz:

#if Foo - 0 == 0 

Środki Foo jest zdefiniowana z 0 lub zdefiniowane bez wartości, ale ponieważ nie ma zdefiniowanego (foo), jak w pierwszym przypadku, Foo miałyby zastosowanie także niezdefiniowane .

Powiązane problemy