[c++] определение текущего класса/неймспейса из макроса

oleg1331

есть ли возможность получить макросом строку "n1.n2.Foo.f" (полный путь к функции, включая неймспейсы) из кода? например, так:


namespace n1 {
namespace n2 {

class Foo {
public:

static void f( int i = 0 ) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};

}
}



макрос __PRETTY_FUNCTION__ выводит
 static void n1::n2::Foo::f(int) 
, что не совсем то, что хочется.
кросплатформенное не обязательно, круто было бы, если хотя бы под gcc работало.

procenkotanya

Вообще говоря, нет: в стандарте языка такой возможности нет, так что и с __PRETTY_FUNCTION__ тебе повезло :)
Непонятно, почему __P_F__ не подходит, и почему не хочется написать фильтр, выкидывающий из __P_F__ всё лишнее и заменяющий "::" на ".".

oleg1331

потому что хочется это использовать для log4cpp, автоматически получая имя категории из полного пути функции. (пример конфиг файла: http://log4cpp.sourceforge.net/api/classlog4cpp_1_1PropertyC... )
если оборачивать это всё в функцию, то она будет вызываться при каждом вызове функции логирования. при большом числе последнего - лишние тормоза. хочется избежать....

procenkotanya

Можно складывать результаты фильтрации __P_F__ в какой-нибудь hash_map (ключом может быть адрес __P_F__, константной строки тогда накладные расходы будут весьма малы.
Препроцессором ты этого не получишь. Если очень хочется, можно перед линковой пройтись по ассемблеру скриптом и переписать там строковые константы от __P_F__ на нужные.

rosali

> то она будет вызываться при каждом вызове функции логирования
если ты в начале каждой функции напишешь
static const string FUNCTION_NAME = get_name(__PRETTY_FUNCTION__);
то она вызовется максимум по одному разу на каждую такую функцию. вроде не очень много?

oleg1331

да, точно. вот это мне нравится. спасибо)
Оставить комментарий
Имя или ник:
Комментарий: