__FILE__ == Makro oder Konstante?



  • '''''''''''''''''''''' schrieb:

    Hi,

    was ist z.B. sowas wie __FILE__? Ist dies ein Makro, eine Konstante oder eine Definition oder was ganz anderes? Wie nennt man diesen Typ?

    __FILE__ ist ein "ding", das verwendbar ist, um es nach char const* auszuwerten und den als nullterminierten string zu betrachten.
    aber makro isses net, man kann ja schlecht #ifdef __FILE__ machen. und augf machen compilern kann man nicht bla##__FILE__ machen und auf machen kann man __FILE__ nicht als templateparameter machen und auf manchen gibt sizeof(__FILE__) 4 und auf manchen die echte stringlänge. seltsam über seltsam.



  • volkard schrieb:

    [...]und auf manchen gibt sizeof(__FILE__) 4 und auf manchen die echte stringlänge.

    Was du so alles ausprobierst :D.



  • __FILE__ ist ein text



  • Wozu spekulieren, wenn man auch in den Standard gucken kann? Abschnitt 16.8 "Predefined macro names" führt u.a. __FILE__ auf.



  • Bashar schrieb:

    Wozu spekulieren, wenn man auch in den Standard gucken kann? Abschnitt 16.8 "Predefined macro names" führt u.a. __FILE__ auf.

    gute idee. ich verlasse mich ab jetzt drauf, daß sizeof(__FILE__)-1 mir die zeichenanzahl gibt. das steht so da.
    leider kann ich bei __LINE__ nicht so genau erkennen, was eine "decimal constant" ist. gat der compilerbauer es mit "int const __LINE__=17" oder mit "#define __LINE__ 17" oder noch anders gemacht? ich frage mich, ob "int myVar##__LINE__;" erlaubt ist.



  • man könnte natürlich auch strlen(__FILE__) verwenden 😉



  • guesswho1 schrieb:

    man könnte natürlich auch strlen(__FILE__) verwenden 😉

    nicht zur compilezeit.



  • volkard schrieb:

    leider kann ich bei __LINE__ nicht so genau erkennen, was eine "decimal constant" ist. gat der compilerbauer es mit "int const __LINE__=17" oder mit "#define __LINE__ 17"

    Imo liegt die Betonung mehr auf decimal, als auf constant. Der Compiler soll also __LINE__ zB so definieren

    #define __LINE__ 20
    

    und nicht zB

    #define __LINE__ 0x14
    

    Das ist im Hinblick auf den ## Operator von Bedeutung.

    volkard schrieb:

    ich frage mich, ob "int myVar##__LINE__;" erlaubt ist.

    Da, so wie ich den Standard verstehe, alles Makros sind, ist das erlaubt.



  • int var ## __LINE__;
    

    funktioniert nur in Makros, außerhalb wird ## vom Präprozessor nicht behandelt, was dazu führt, dass der Compiler sich über nen Syntaxfehler beschwert. Innerhalb eines Makros geht das, allerdings wird __LINE__ dann durch die Zeilenzahl ersetzt, an der das Makro steht - nicht der Aufruf.

    Aus dem selben Grund funktioniert auch

    puts(# __LINE__ );
    

    nicht.



  • volkard schrieb:

    leider kann ich bei __LINE__ nicht so genau erkennen, was eine "decimal constant" ist.

    Ich auch nicht. Vielleicht hat man das ohne Nachzudenken vom C-Standard abgeschrieben. In C++ müsste es eigentlich "decimal literal" o.ä. heißen.


Anmelden zum Antworten