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

Непонятно, почему __P_F__ не подходит, и почему не хочется написать фильтр, выкидывающий из __P_F__ всё лишнее и заменяющий "::" на ".".
потому что хочется это использовать для log4cpp, автоматически получая имя категории из полного пути функции. (пример конфиг файла: http://log4cpp.sourceforge.net/api/classlog4cpp_1_1PropertyC... )
если оборачивать это всё в функцию, то она будет вызываться при каждом вызове функции логирования. при большом числе последнего - лишние тормоза. хочется избежать....
если оборачивать это всё в функцию, то она будет вызываться при каждом вызове функции логирования. при большом числе последнего - лишние тормоза. хочется избежать....
Можно складывать результаты фильтрации __P_F__ в какой-нибудь hash_map (ключом может быть адрес __P_F__, константной строки тогда накладные расходы будут весьма малы.
Препроцессором ты этого не получишь. Если очень хочется, можно перед линковой пройтись по ассемблеру скриптом и переписать там строковые константы от __P_F__ на нужные.
Препроцессором ты этого не получишь. Если очень хочется, можно перед линковой пройтись по ассемблеру скриптом и переписать там строковые константы от __P_F__ на нужные.
> то она будет вызываться при каждом вызове функции логирования
если ты в начале каждой функции напишешь
static const string FUNCTION_NAME = get_name(__PRETTY_FUNCTION__);
то она вызовется максимум по одному разу на каждую такую функцию. вроде не очень много?
если ты в начале каждой функции напишешь
static const string FUNCTION_NAME = get_name(__PRETTY_FUNCTION__);
то она вызовется максимум по одному разу на каждую такую функцию. вроде не очень много?
да, точно. вот это мне нравится. спасибо)
Оставить комментарий
oleg1331
есть ли возможность получить макросом строку "n1.n2.Foo.f" (полный путь к функции, включая неймспейсы) из кода? например, так:макрос __PRETTY_FUNCTION__ выводит , что не совсем то, что хочется.
кросплатформенное не обязательно, круто было бы, если хотя бы под gcc работало.