__FILE__ == Makro oder Konstante?
-
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?
-
-
'''''''''''''''''''''' 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__ 20und nicht zB
#define __LINE__ 0x14Das 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.