#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
Комментариев нет:
Отправить комментарий