Препроцессор: превратить __LINE__ в строку

128
22 сентября 2019, 19:00

Навеяно этим вопросом.

Все время от времени пользуются отладочным выводом с предопределенными макросами типа

cout << __FILE__ << " line " << __LINE__ << endl;

Задумался - как написать макрос FILELINE, чтоб эту строчку выше заменить на

cout << FILELINE << endl;

Ну т.е. чтоб макрос раскрывался в строку, в составе которой было число, в которую раскрывается __LINE__. Как ни кручусь - все время или число оказывается не в кавычках, или в кавычках оказывается "__LINE__".

Ну не может быть, чтоб эта задача была неразрешима. Ткните носом, о чем я не подумал?

Answer 1

Таки получилось:

#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)
#define FILELINE (__FILE__  " line " S__LINE__)

https://stackoverflow.com/questions/5641427/how-to-make-preprocessor-generate-a-string-for-line-keyword

Answer 2

Перевод ответа с английского StackOverflow:

Вам нужно сделать это в несколько этапов:

#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)

Почему?

Краткий ответ: Вам нужно раскрыть макрос __LINE__, прежде чем передавать его в #x.

Развернутый ответ: Во-первых, используя оператор # в функционально-подобном макросе, он должен сопровождаться параметром макроса, но __LINE__ не является параметром, поэтому компилятор жалуется, что он является ошибочным оператором.

Во-вторых, __LINE__ сам по себе является макросом и содержит номер текущей строки, его следует раскрыть до числа перед использованием его с #, в противном случае вы получите строку "__LINE __" вместо числа.

Макрос S2 (__LINE__) расширяет __LINE__ до номера строки, затем мы передаем номер строки в #x.

READ ALSO
Открытие и считывание файла

Открытие и считывание файла

При вот таком вот способе открытия файла выдает ошибку следующего характера: (фото 1 и фото 2)Как можно исправить? Спасибо

112
Qt. Начало работы

Qt. Начало работы

Установил Qt Creator версии 48

109
QComboBox Delegate и отображение данных в QTableView

QComboBox Delegate и отображение данных в QTableView

Есть несколько вопросов по коду, и возможно вы предложите более грамотный вариант, тк мой выглядит как костыль

106
Блокировка запуска программы [закрыт]

Блокировка запуска программы [закрыт]

Пользователь сам определяет какую программу хочет защитить, при запуске программы под защитой появляется окно блокировки

142