Da
1: #include <iostream>
2:
3: #define FOO std::cout << __LINE__ << ' ' \
4: << __LINE__ << '\n';
5: int main()
6: {
7: FOO // the first two __LINE__s come from here, that's one line of code
8:
9: std::cout << __LINE__ << ' ' \ // 3rd __LINE__ comes from here
10: << __LINE__ << '\n'; // 4th __LINE__ comes from here
11: }
__LINE__
expandiert nach physikalischen Leitungen, keine logischen Linien:
Die Zeilennummer der Stromquellenleitung ist um eins größer als die Anzahl der new-line Zeichen lesen oder in die Übersetzungsphase 1 (2.2) eingeführt, während die Quelldatei zum aktuellen Token verarbeitet wird.
Während die von \
beendet Linien in Übersetzungsphase verkettet 2.
Die andere nur logische Implementierung wäre 3 und 4 für den Aufruf von FOO zu drucken, aber das scheint nicht sehr nützlich.
Sie können auch folgendermaßen aussehen: __LINE__
unterscheidet sich nicht von anderen Makros. Es wird nur automatisch vom Compiler am Anfang jeder Zeile aktualisiert. So wird der Code Art interpretiert die auf diese Weise:
#include <iostream>
#define __LINE__ 3
#define FOO std::cout << __LINE__ << ' ' \
<< __LINE__ << '\n';
int main()
{
#define __LINE__ 7
FOO
#define __LINE__ 9
std::cout << __LINE__ << ' ' \ // Yeah, you're right
#define __LINE__ 10
<< __LINE__ << '\n';
}
Dies gilt nicht, Code, aber es zeigt, wie die Dinge funktionieren. Wenden Sie die üblichen Makro-Erweiterungsregeln an und Sie erhalten die Ausgabe, die Sie haben.
+1, sehr klare Beschreibung –
Und das ist durch den Standard garantiert? Das wäre großartig! Ich habe einige ziemlich große Makros, die mehrere '__LINE__' Tokens enthalten, und ich würde sie gerne mit umgekehrten Schrägstrichen teilen, aber sie müssen beim Erweitern dieselbe Zeile ergeben. – fredoverflow
@FredOverflow Ja. – ybungalobill