2017-01-12 9 views
1

По какой-то причине я не нашел прямого ответа на этот вопрос в документации.Как присвоить значение __func__ в C?

Мой друг говорит, что я могу напрямую использовать __func__ и назначить ему, не объявляя об этом.

documentation говорит:

1. The identifier __func__ shall be implicitly declared by the translator as 
if, immediately following the opening brace of each function definition, the 
declaration 

    static const char __func__[] = "function-name"; 

appeared, where function-name is the name of the lexically-enclosing function. 

Таким образом, это значит, я должен объявить его каждый раз, когда я начинаю функцию с static const char __func__[] = "function-name"; вместо strcpy(__func__, "function-name");, потому что он уже был объявлен и будет обрабатываться компилятором?

Прошу прощения, если это звучит как основной вопрос, но я могу смущен!

+3

Ну, вы не можете назначить ему, так как это массив const ... –

+2

В документах упоминается * переводчик *, который назначает строку. Почему вы считаете себя переводчиком? – tofro

+0

Да, я понимаю, как глупо звучать, когда я читаю его сейчас. –

ответ

3

Вам не нужно объявлять или определять его. Это неявно доступно для вашего кода внутри определения функции.

void func_with_fancy_name() 
{ 
    puts(__func__); // Will print the function name 
} 

Назначение - это другое дело. Вы не можете сделать это. Спецификатор const в объявлении «как будто» должен сдерживать вас.

+1

'printf ("% s ", __func __);' было бы лучше, если бы имя-mangling застряло '%' в имени функции. –

+0

@ KenY-N - Да, я размышлял об этом. Пошел с 'puts' вместо этого на вторую мысль. – StoryTeller

+1

@ KenY-N Я не верю n ame mangling разрешено до тех пор, пока '__func__' не получит значение компилятором, иначе компилятор не будет следовать стандартным требованиям. '__func__' должно указывать точное имя функции. – Lundin

2

My friend says I can directly use __func__ [...]

Да, вы можете. Уведомлять об этой детали

[...] shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name"; 

appeared, [...]

Таким образом, вам не нужно быть явным.

.. and assign to it,

Нет, вы не можете. Это постоянная.

+0

Я только что прочитал строку в документации, это внезапно делает так много смысла! Я чувствую себя идиотом:/ –

+0

такое «быстрое чтение» документации произошло со всеми нами (более одного раза) – user3629249