Makro



  • Gibt es eigentlich irgendeinen Weg um dieses Makro

    #define FUNC_CALL(argument)\
    { \
    	\
    	std::cout << #argument << std::endl; \
    	argument; \
    }
    

    mit gleicher Funktionalität zu ersetzen?



  • Mit Makros bin ich nicht fitt,

    aber wenn DU eine Funktion haben willst die alles ausgibt:

    template <class T>
    void ausgeben(const T & arg)
    {
      std::cout<<arg<<endl;
    }
    

    Eventuell ist es das was Du suchst. Das Makro kann ich ehrlich gesagt nicht lesen.



  • nein, dass Macro kann man nicht wirklich umschreiben.

    template<class T>
    void func_call(T const &obj)  {
      //Ausgabe wird ein Problem
      obj();
    }
    


  • Das dachte ich mir. 😞
    Aber es muss doch irgendeinen Weg geben unter MSVC++6 wenigstens im Debug Modus die Funktionsnamen rauszubekommen wenn sie aufgerufen werden. Und im Release-Built dann eben nur die Fkt.Adressen. Die kann ich ja mittels Map-File auswerten.
    Weiss jemand, wie und ob das geht?



  • Knuddlbaer schrieb:

    Mit Makros bin ich nicht fitt,

    aber wenn DU eine Funktion haben willst die alles ausgibt:

    template <class T>
    void ausgeben(const T & arg)
    {
      std::cout<<arg<<endl;
    }
    

    Eventuell ist es das was Du suchst. Das Makro kann ich ehrlich gesagt nicht lesen.

    Als kurze Erklärung:
    Das Makro wird mit einer Funktion als Parameter aufgerufen. Da ersetzt der Preprozessor dann den Makroaufruf im Quelltext durch die Ausgabe des Parameters (hier der Funktionsaufruf) als Text nach cout und einem anschliessenden Aufruf des Parameters (also der Funktion).

    FUNC_CALL(test());
    

    wird zu

    std::cout << "test()" << std::endl;
    test();
    


  • Drakos schrieb:

    Aber es muss doch irgendeinen Weg geben unter MSVC++6 wenigstens im Debug Modus die Funktionsnamen rauszubekommen wenn sie aufgerufen werden.

    In neueren VC++-Versionen gibt es das Makro __FUNCTION__.



  • 🙂
    Da habe ich ja dann wieder ein Makro drin. Das wollte ich ja vermeiden. 🙄



  • Ah nu schnall ich das ;o)

    Versuch mal

    void foo()
    {
    
    }
    
    struct t
    {
    	void operator()()
    	{
    	}
    };
    
    template <class T>  
    void ausgeben(T  arg)  
    {  
    	std::cout<<typeid(arg).name()<<std::endl;  
    	arg(); 
    }
    
    int main(int argc, char* argv[])
    {
    	t functor;
    	ausgeben(foo);
    	ausgeben(functor);
    
    	return 0;
    }
    

    Ohne gewähr, nur so ne schnappsidee, aber vllt hilfts ja



  • ...und manchmal ist der Präprozessor einfach die beste Lösung...


Anmelden zum Antworten