Как добавить имя функции из которой вызывается define без форматирования
Есть такой код:
#define MESSAGE(c) #c": cannot access class member "__FUNCTION__"!"
int main()
{
cout << MESSAGE(CTrader);
}
Который не работает [error: unable to find string literal operator ‘operator""__ FUNCTION __’ with ‘const char [38]’, ‘long unsigned int’ arguments]
!(специально сделал отступ между нижними подчёркиваниями)
В консоли должно вывестись: CTrader : cannot access class member main! аргумент входящий в MESSAGE : имя функции из которого вызывается дефайн
Даже если добавить # перед __ FUNCTION __ то всё равно будут ошибки.
Как сделать так, чтобы через дефайн получалась строка, содержащая первый входящий аргумент (его псевдоним, например CTrader) и имя функции из которой дефайн вызывается?
Ответы (1 шт):
__FUNCTION__ — это не строковый литерал, который можно просто конкатенировать (типа "a""b"), и даже не макрос. Поэтому конструкция "xxx"_something воспринимается как user-defined строковый литерал, отсюда и ошибка. Исправить можно, например, так:
#include <iostream>
#include <string>
#define MESSAGE(c) #c": cannot access class member " + std::string(__FUNCTION__) + "!"
int main() {
std::cout << MESSAGE(CTrader);
}
Кстати, имя __FUNCTION__ не описано в стандарте, так что для переносимости лучше использовать __func__ (что заодно показывает, что это не макрос).
Также можно использовать https://en.cppreference.com/w/cpp/utility/source_location.