Parce
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__
se dilate à des lignes physiques, les lignes non logiques:
Le numéro de ligne de la ligne de source de courant est plus grand que le nombre de caractères nouvelle ligne de lecture ou introduit en phase de traduction 1 (2.2) lors du traitement du fichier source sur le jeton en cours.
Alors que les lignes terminées par \
sont concaténés en phase de traduction 2.
L'autre que la mise en œuvre logique serait d'imprimer 3 et 4 pour l'invocation de FOO, mais qui ne semble pas très utile.
Vous pouvez également regarder de la manière suivante: __LINE__
n'est pas différente de toute autre macro. Il est juste mis à jour automatiquement par le compilateur au début de chaque ligne. Donc, le code est interprété comme suit:
#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';
}
Ce code n'est pas valide, mais il montre comment les choses fonctionnent. Appliquez les règles habituelles de développement de macros et vous obtiendrez la sortie que vous avez.
+1, description très claire –
Et c'est garanti par la norme? Ce serait génial! J'ai des macros assez volumineuses contenant plusieurs jetons '__LINE__', et je voudrais vraiment les séparer avec des barres obliques inverses, mais elles doivent donner la même ligne lorsqu'elles sont développées. – fredoverflow
@FredOverflow Oui. – ybungalobill