GCC 9 недавно изменил поведение директивы __LINE__
в некоторых случаях. Программа ниже иллюстрирует изменение:
#include <stdio.h>
#define expand() __LINE__
int main() {
printf("%d\n",expand(
));
return 0;
}
Поскольку макрос expand()
(который расширяется до __LINE__
) охватывает более одной строки, GCC до 8.3 (и Clang до 8.0) считает номер последней строки раскрытия, выводя 5
. Но GCC 9 учитывает первую строку и печатает 4.
(Ссылка Godbolt: https://godbolt.org/z/3Nk2al)
Стандарт C11 не очень точно описывает точное поведение __LINE__
, за исключением:
6.10.8 Стандартные имена макросов
Значения предопределенных макросов, перечисленных в следующих подпунктах (кроме
__FILE__
и__LINE__
), остаются постоянными во всей единице перевода.(...)
6.8.10.1 Обязательные макросы
Следующие имена макросов должны быть определены реализацией:
(...)
__LINE__
Предполагаемый номер строки (в текущем исходном файле) текущей исходной строки (целочисленная константа).
Я предполагаю, что это означает, что точное значение определяется реализацией, и поэтому нельзя ожидать, что его значение останется постоянным для разных версий компилятора или разных компиляторов. Или есть какие-то аргументы на этот счет в другом месте стандарта?
Например, можно ли утверждать, что предполагаемый номер строки текущей исходной строки должен быть стабильным, пока сам исходный текст не изменился?
__LINE__
в прошлом, будут нечувствительны к этому изменению (мне иногда нужна была удобочитаемость для человека (а люди гибки) и гарантия того, что указанные номера строк имеют правильные отношения последовательности (который должен быть сохранен при этом изменении)). Это что-то ломает? - person dmckee --- ex-moderator kitten   schedule 05.06.2019-E
), чтобы увидеть результаты подстановки макроса. При использовании компилятора, который я использую,printf
заканчивается одной строкой, включая завершающий);
- person user3386109   schedule 05.06.2019assert
, занимающих несколько строк. Из-за этого изменения разработчики со старыми версиями GCC или использующие Clang получат разные оракулы, и я заметил разницу. - person anol   schedule 06.06.2019