Wissenswertes zu Defines - FAQ?



  • Aus einem Thread über defines ergab sich folgendes:

    Defines repräsentieren char-Pointer auf die jeweiligen Strings. Um diese zu kombinieren, kann man strcat verwenden.

    #define D            "das " 
    #define A            "ist "
    #define S            "schön!"
    
    char string[80]; 
       strcpy( string, D); 
       strcat( string, A);
       strcat( string, S);
        if(AfxMessageBox( string ,MB_YESNO) == IDYES)
    // In der MessageBox steht nun: Das ist schön!
    

    Defines können aber viel einfacher ohne weiteres Verknüpft werden. (siehe nachfolgendes Beispiel)

    #define D     "(das )"
    #define A     " ist "
    #define S     "schön!"
    
    // will ich nun wo "(das ) ist schön!" im Source haben mach ich einfach
    
    CString test;
    test = (D A S);
    //In test steht jetzt: "(das ) ist schön!"
    

    Defines werden vom Präprozessor verarbeitet. Und er ersetzt den Text D durch (das ) in deinem Quellcode. Und erst dieser bearbeitete Quellcode wird dann dem Kompiler übergeben.

    Somit sind Defines Textersetzungen, die Beispielsweise in einer slebst angelegten defines.h angelegt werden können. So können statische Texte zum einen in jeder Klasse verwendet werden, wenn man macht

    #include "defines.h"
    

    Zum anderen können dann Textmeldung, Konstanten und ähnliches schnell geändert werden, in dem man die defines.h aufmacht und dort den Wert ändert. Man muss also nicht den kompletten Source nach der gesuchten Konstanten durchsuchen.

    mfg Polofreak



  • Polofreak schrieb:

    Defines können aber viel einfacher ohne weiteres Verknüpft werden. (siehe nachfolgendes Beispiel)

    Das hat nicht mit #define zu tun. Das ist eine Eigenschaft der Stringliterale.



  • Polofreak schrieb:

    Defines repräsentieren char-Pointer auf die jeweiligen Strings.

    Defines müssen nicht unbedingt für chars stehen. Meistens ist es in der MFC sogar so, dass sie für ein UINT stehen. Beispiele aus der afx.h:

    // Standard constants
    #undef FALSE
    #undef TRUE
    #undef NULL
    
    #define FALSE   0
    #define TRUE    1
    #define NULL    0
    


  • Defines können auch Parameter haben. 🙂

    Leider habe ich meine Mappe verliehen und weiß nicht mehr, an wen. 😞
    Ich glaube, das war so:

    #define MAX(a,b) a<b?b:a
    
    int n = MAX(10,5);
    ASSERT(n == 10);
    

    Das sollte keinen ASSERT geben.



  • MFK schrieb:

    Polofreak schrieb:

    Defines können aber viel einfacher ohne weiteres Verknüpft werden. (siehe nachfolgendes Beispiel)

    Das hat nicht mit #define zu tun. Das ist eine Eigenschaft der Stringliterale.

    Habe ich nie bestritten oder gegeteiliges behauptet, aber sie können so verknüpft werden!



  • Polofreak schrieb:

    Habe ich nie bestritten oder gegeteiliges behauptet, aber sie können so verknüpft werden!

    Was du schreibst, gilt für Stringliterale, nicht für Defines allgemein.

    Das ist doch das gleiche wie:

    // Defines kann man einem char* zuweisen
    char* a = A;
    // Aber einem Define kann man nichts zuweisen
    A = 42; // (geht nicht)
    

    Alles richtig, wenn A durch ein Stringliteral ersetzt wird. Aber deswegen noch lange nicht für alle Defines gültig.

    Stringliterale kann ich auch so verknüpfen, ohne Defines.



  • Zum anderen können dann Textmeldung, Konstanten und ähnliches schnell geändert werden, in dem man die defines.h aufmacht und dort den Wert ändert. Man muss also nicht den kompletten Source nach der gesuchten Konstanten durchsuchen.

    Man kann es aber auch lassen und eine Stringtable erstellen 🙄



  • just for fun:

    #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    	const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
    		{ return &theClass::messageMap; } \
    	const AFX_MSGMAP* theClass::GetMessageMap() const \
    		{ return &theClass::messageMap; } \
    	AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \
    	{ &baseClass::GetThisMessageMap, &theClass::_messageEntries[0] }; \
    	AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    	{ \
    
    #else
    #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    	const AFX_MSGMAP* theClass::GetMessageMap() const \
    		{ return &theClass::messageMap; } \
    	AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \
    	{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
    	AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    	{ \
    
    #endif
    


  • ernsti und was willst du jetzt damit sagen? Oder wolltest einfach zeigen dass du auch defines gefunden hast wenn du die mfc nach define durchsuchtst!


Anmelden zum Antworten