Навеяно этим вопросом.
Все время от времени пользуются отладочным выводом с предопределенными макросами типа
cout << __FILE__ << " line " << __LINE__ << endl;
Задумался - как написать макрос FILELINE
, чтоб эту строчку выше заменить на
cout << FILELINE << endl;
Ну т.е. чтоб макрос раскрывался в строку, в составе которой было число, в которую раскрывается __LINE__
. Как ни кручусь - все время или число оказывается не в кавычках, или в кавычках оказывается "__LINE__"
.
Ну не может быть, чтоб эта задача была неразрешима. Ткните носом, о чем я не подумал?
Таки получилось:
#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
Перевод ответа с английского StackOverflow:
Вам нужно сделать это в несколько этапов:
#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
Почему?
Краткий ответ: Вам нужно раскрыть макрос __LINE__
, прежде чем передавать его в #x
.
Развернутый ответ: Во-первых, используя оператор #
в функционально-подобном макросе, он должен сопровождаться параметром макроса, но __LINE__
не является параметром, поэтому компилятор жалуется, что он является ошибочным оператором.
Во-вторых, __LINE__
сам по себе является макросом и содержит номер текущей строки, его следует раскрыть до числа перед использованием его с #
, в противном случае вы получите строку "__LINE __"
вместо числа.
Макрос S2 (__LINE__)
расширяет __LINE__
до номера строки, затем мы передаем номер строки в #x
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При вот таком вот способе открытия файла выдает ошибку следующего характера: (фото 1 и фото 2)Как можно исправить? Спасибо
Есть несколько вопросов по коду, и возможно вы предложите более грамотный вариант, тк мой выглядит как костыль
Пользователь сам определяет какую программу хочет защитить, при запуске программы под защитой появляется окно блокировки