__FILE__<<__LINE__ in string transferieren



  • Hallo,

    um meinen Debug-Output code zu komplettieren, würde ich gerne file, line und function informationen mit ausgeben.
    Ich definiere mir ein par short-hands:

    #ifndef __FUNCTION__
    #define __FUNCTION__ " "
    #endif
    
    #ifndef __FILE__
    #define __FILE__ " "
    #endif
    
    #ifndef __LINE__
    #define __LINE__ " "
    #endif
    
    #ifndef __LPF__ //long pretty information about function 
    #define __LPF__ __FILE__<<"\n"<<"Line:"<<__LINE__<<":"<<__FUNCTION__<<"\n"
    #endif
    
    #ifndef __SPF__ //short pretty information about function 
    #define __SPF__ __FUNCTION__<<" in line "<<__LINE__
    #endif
    
    #ifndef __F__ //short for function 
    #define __F__ __FUNCTION__
    #endif
    

    jetzt kann ich mittels

    wcout <<"INFO: " << 	__LPF__ <<endl;
    

    Detailinformationen rausschreiben.

    Gibt es eine Möglichkeit __LPF__ in einen wstring überzuführen?
    Ich könnte dann das ergebnis an eine methode übergeben.
    ICh habe ein parr tools, die in einem bestimmten format information in verschiedene files schreiben (z.b: log, info). wenn ich nun __LPF__ als argument beim aufruf mit übergeben könnte, könnte ich die die info, logfile gleich mit hinweisen zu zeilennummern etc. versehen.

    Danke
    alex



  • AbsoluteBeginner_ schrieb:

    Gibt es eine Möglichkeit __LPF__ in einen wstring überzuführen?

    Ja, mit stringstreams.
    Übrigens sind Bezeichner mit zwei Unterstrichen im Namen, und solche mit einem Unterstrich am Anfang, für den Compiler reserviert.



  • Danke für den Hinweis aud die stringstreams, und auf die unterstriche, werde dies ändern.



  • Es geht auch ohne Laufzeitkosten (ich glaub nicht das Compiler Stringstream Operationen mit Konstanten wegoptimieren können):

    #include <iostream>
    
    // _m_str macht den inhalt eines macros zu einem string
    #define _m_str_(a) #a
    #define _m_str(a) _m_str_(a)
    
    // _m_cat verbindet 2 code stücke (mit macro expansion)
    #define _m_cat_(a,b) a##b
    #define _m_cat(a,b) _m_cat_(a,b)
    
    // wchar_t formen von __FUNCTION, __LINE__ und __FILE
    #define W_FUNC _m_cat(L,__FUNCTION__)
    #define W_LINE _m_cat(L,_m_str(__LINE__))
    #define W_FILE _m_cat(L,__FILE__)
    
    // zusammengesetzt
    #define W_PRETTY W_FILE L"\nLine:" W_LINE L":" W_FUNC L"\n"
    #define W_PRETTY_SHORT W_FUNC L" in line " W_LINE
    
    int main(int argc, char **argv)
    {
    	std::wcout << W_PRETTY << std::endl;
    	std::wcout << W_PRETTY_SHORT << std::endl;
    
    	return 0;
    }
    


  • ... damit mir sowas nicht wieder passiert:
    wo finde ich denn eine übesicht bzgl. geschützer namen/bezeichner?

    danke alex



  • @DerKuchen:
    Super! Vielen Dank für das ausführliche Beispiel!
    Ist schon 'eingebaut'.

    Grüße
    Alex


  • Mod

    AbsoluteBeginner_ schrieb:

    ... damit mir sowas nicht wieder passiert:
    wo finde ich denn eine übesicht bzgl. geschützer namen/bezeichner?

    C++ Standard, Kapitel 2, inklusive der dortigen Verweise auf die anderen Kapitel. Besonders 2.10 und 2.11.


Log in to reply