Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » #ifdef Preprocessor Anweisungen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.04.2008, 15:33 Uhr
~Caty
Gast


Hallo liebe Community,

ich hab ein seltsames Problem, dass sich mir nicht wirklich erschließen will.

Am besten schmeiß ich gleich mal den Code hier hinein:


C++:
#ifdef __WIN32__ || _MS_DOS_ || WIN32 || MS_DOS
    cout << "win32" << endl;
#else
    cout << "else" << endl;
#endif



Ich nutze Visual Studio 2008 und im Preprocessor ist WIN32 eingestellt.

Der Output des obigen Codes ist: "else".


Folgender Code bringt den richtigen Output:


C++:
#ifdef WIN32 || MS_DOS
    cout << "win32" << endl;
#else
    cout << "else" << endl;
#endif



Ähm ja, wieso klappt das mit dem ersten Codestück nicht? Es sind doch ODER Verknüpfungen, oder?

Danke für die Hilfe,
MFG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.04.2008, 20:37 Uhr
Tommix



Hallo,
ehrlich gesagt ist mir die Notation so (logische Verknüpfung bei #ifdef) noch nicht untergekommen. Ich denke mal Du wolltest mehr

C++:
#if defined __WIN32__ || defined _MS_DOS || defined usw.


Der Compiler wirft bei Deiner Notation auch eine Warnung aus.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.05.2008, 14:18 Uhr
~Caty
Gast


Hmm, wo ist der Unterschied zwischen beiden?

Hab hier ein C++ Buch liegen und da sind #if defined und #ifdef als Äquivalente dargestellt. Also im Grunde ist dein Code der gleiche wie meiner. :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.05.2008, 16:31 Uhr
Tommix




Zitat von ~Caty:
Hmm, wo ist der Unterschied zwischen beiden?

Hab hier ein C++ Buch liegen und da sind #if defined und #ifdef als Äquivalente dargestellt. Also im Grunde ist dein Code der gleiche wie meiner. :-)

Nein, ist er nicht. Dein Code liest sich für den Präprozessor wie

C++:
#ifdef __WIN32__ und hier kommt noch mehr Text der mich nicht interessiert.


Die Abfrage mehrere Bezeichner ist da nicht vorgesehen.
Siehe auch http://msdn.microsoft.com/de-de/library/2a1b21sf.aspx

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.05.2008, 16:34 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wenn du in deinem ersten Beispiel WIN32 an die erste Stelle setzt wie im 2. Beispiel dann wird er auch da nicht in den else Block springen.

IMHO prüft der Compiler bei

C++:
#ifdef WIN32 || MS_DOS


nur ob WIN32 definiert ist. Was er mit dem Rest des Ausdrucks macht weiß ich nicht evtl ignorieren?

Ich denke das wird ungefähr das selbe sein wie

C++:
#if (defined WIN32) || MS_DOS




EDIT: hmm Tommix war schneller

Dieser Post wurde am 05.05.2008 um 16:35 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.05.2008, 09:57 Uhr
~Caty
Gast


Ahhhhhhh....jetzt kommt langsam Licht ins Dunkel.

Danke für die Info. :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.05.2008, 13:13 Uhr
0xdeadbeef
Gott
(Operator)


Eigentlich sollte der Präprozessor

C++:
#ifdef __WIN32__ || _MS_DOS_ || WIN32 || MS_DOS


gar nicht annehmen. Die Syntax für #ifdef-Direktiven ist

Zitat von C++-Standard, Sektion 16:

#ifdef identifier new-line group(opt)


...wobei group eine weitere Präprozessor-Direktiven-Gruppe bezeichnen kann. Der Hintergrund in der Spezifikation ist, dass #if-sections ein #endif brauchen. Ein Identifier ist definiert als

Zitat von C++-Standard, Sektion 2.10:


Code:
identifier:
    nondigit
    identifier nondigit
    identifier digit


(Die Code-Tags hier nur, um die Einrückung zu erhalten)


...das bedeutet im Grunde das selbe wie in Variablennamen auch.

In der Praxis bedeutet das

C++:
#ifdef FOO // richtig
#ifdef FOO10 // richtig
#ifdef 1 // Falsch
#ifdef FOO || BAR // Falsch


...und zwar jeweils auf Syntaxebene. Semantik ist für die falschen Ausdrücke dementsprechend nicht mehr definiert, das heißt, wenn dein Präprozessor das akzeptiert, ist im C++-Standard nicht vorgegeben, was er daraus macht. Es ist stumpf und einfach falsch.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.05.2008 um 13:14 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: