Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

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

#cpp #c #макросы #препроцессор


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

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

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


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

cout << FILELINE << endl;


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

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


Ответы

Ответ 1



Перевод ответа с английского StackOverflow: Вам нужно сделать это в несколько этапов: #define S1(x) #x #define S2(x) S1(x) #define LOCATION __FILE__ " : " S2(__LINE__) Почему? Краткий ответ: Вам нужно раскрыть макрос __LINE__, прежде чем передавать его в #x. Развернутый ответ: Во-первых, используя оператор # в функционально-подобном макросе, он должен сопровождаться параметром макроса, но __LINE__ не является параметром, поэтому компилятор жалуется, что он является ошибочным оператором. Во-вторых, __LINE__ сам по себе является макросом и содержит номер текущей строки, его следует раскрыть до числа перед использованием его с #, в противном случае вы получите строку "__LINE __" вместо числа. Макрос S2 (__LINE__) расширяет __LINE__ до номера строки, затем мы передаем номер строки в #x.

Ответ 2



Таки получилось: #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

Комментариев нет:

Отправить комментарий