Identificador predefinido __func__ en C

Antes de comenzar a hablar sobre __func__ , escribamos un fragmento de código y anticipemos el resultado: 

C

#include <stdio.h>
 
int main()
{
   printf("%s",__func__);
   return 0;
}

¿Compilará el error debido a que no define la variable __func__ ? Bueno, como habrás adivinado hasta ahora, no dará ningún error de compilación y ¡imprimirá main

El estándar del lenguaje C (es decir, C99 y C11) define un identificador predefinido de la siguiente manera en la cláusula 6.4.2.2:

El identificador __func__ debe ser declarado implícitamente por el traductor como si, inmediatamente después de la llave de apertura de cada definición de función, la declaración
static const char __func__[] = “nombre-función”;
apareció, donde nombre-función es el nombre de la función que encierra léxicamente.

Significa que el compilador de C agrega implícitamente __func__ en cada función para que pueda usarse en esa función para obtener el nombre de la función. Para entenderlo mejor, escribamos este código: 

C

#include <stdio.h>
void foo(void)
{
   printf("%s",__func__);
}
void bar(void)
{
   printf("%s",__func__);
}
 
int main()
{
   foo();
   bar();
   return 0;
}

Y dará salida como foobar . Un caso de uso de este identificador predefinido podría ser registrar la salida de un gran programa donde un programador puede usar __func__ para obtener la función actual en lugar de mencionar explícitamente el nombre completo de la función. Ahora que pasa si definimos una variable mas de nombre __func__ 

C

#include <stdio.h>
 
int __func__ = 10;
int  main()
{
   printf("%d",__func__);
   return 0;
}

Dado que el estándar C dice que el compilador define implícitamente __func__ para cada función como el nombre de la función, no deberíamos definir __func__ en primer lugar. Es posible que obtenga un error, pero el estándar C dice «comportamiento indefinido» si alguien define explícitamente __func__ .

Solo para terminar la discusión sobre el identificador predefinido __func__ , mencionemos también las macros predefinidas (como __FILE__ y __LINE__, etc.). Básicamente, la cláusula estándar C 6.10.8 menciona varias macros predefinidas, de las cuales __FILE__ y __LINE__ son relevantes aquí. 

Vale la pena ver el resultado del siguiente fragmento de código: 

C

#include <stdio.h>
 
int main()
{
   printf("In file:%s, function:%s() and line:%d",__FILE__,__func__,__LINE__);
 
   return 0;
}

¡En lugar de explicar el resultado, le dejaremos esto a usted para que adivine y comprenda el papel de __FILE__ y __LINE__ !
Haga clic en Me gusta/Tweet/G+1 si encuentra útil lo anterior. Además, déjenos un comentario para obtener más aclaraciones o información. Nos encantaría ayudar y aprender 🙂
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *