Поскольку
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__
расширяется до физических линий, а не логические линии:
номер строки текущей строки источника на единицу больше, чем число новой строки символов для чтения или введен в фазу 1 перевода (2.2) при обработке исходного файла в текущий токен.
В то время как линия закончилась \
сцепляется в фазе перевода 2.
Другая Логично реализация будет печатать 3 и 4 для вызова FOO, но кажется, что не очень полезно.
Вы также можете посмотреть на это следующим образом: __LINE__
ничем не отличается от любых других макросов. Он просто обновляется автоматически компилятором в начале каждой строки. Таким образом, код вида интерпретируется так:
#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';
}
Это не правильный код, но он показывает, как работают вещи. Примените обычные правила расширения макросов, и вы получите полученный результат.
+1, очень четкое описание – 2010-11-27 11:27:58