Могу ли я сохранить указатель на __PRETTY_FUNCTION__ для дальнейшего использования или мне нужно немедленно скопировать строку? - PullRequest
2 голосов
/ 18 июня 2020

Какое время жизни производит строка __PRETTY_FUNCTION__?

Я знаю, что __func__ генерирует эквивалент static const char __func__[] = "function-name";, благодаря этому static, если я хочу создать запись чего-то, что произошло где-то в функции для последующего обращения, я могу просто сохранить значение __func__ в поле const char* в записи и получить его, когда захочу, спустя долгое время после того, как я покинул область действия функции.

Действует ли __PRETTY_FUNCTION__ так же, или строка, которую он генерирует, ведет себя как локальное временное значение? Скажем, будет ли это работать надежно или может выйти из строя, если fname указывает на место, где раньше было имя функции, и мне нужно сделать буфер и вместо этого сделать strncpy() или что-то подобное?

#include <stdio.h>
const char* fname = NULL;

void foo()
{
    fname = __PRETTY_FUNCTION__;
}

int main()
{
    foo();
    printf(fname);
    return 0;
}

1 Ответ

4 голосов
/ 18 июня 2020

Все три константы, __func__, __FUNCTION__ и __PRETTY_FUNCTION__, ведут себя одинаково. В G CC Manual говорится:

G CC предоставляет три константы magi c, которые содержат имя текущей функции в виде строки. В режимах C ++ 11 и более поздних все три обрабатываются как константные выражения и могут использоваться в контексте constexpr.

...