c++ - parametros - __func__ fuera de la definición de la función
funciones en c++ (2)
¿Qué debería pasar si usamos la variable predefinida __func__
fuera de una función en C (C99 / C11) y C ++?
#include <stdio.h>
const char* str = __func__;
int main(void)
{
printf("%s", str);
return 0;
}
gcc 4.7.2 solo da una advertencia (con -Wall -W -pedantic
habilitado) y no imprime nada.
Standard no dice nada al respecto explícitamente:
ISO / IEC 14882: 2011
8.4.1 En general [dcl.fct.def.general]
8 La variable predefinida de función local
__func__
se define como si fuera una definición de la formastatic const char __func__[] = "function-name";
se ha proporcionado, donde nombre-función es una cadena definida por la implementación. No se especifica si una variable de este tipo tiene una dirección distinta de la de cualquier otro objeto en el programa.
ISO / IEC 9899: 2011
6.4.2.2 Identificadores predefinidos
1 El
__func__
declarará implícitamente el identificador__func__
como si, inmediatamente después de la llave de apertura de cada definición de función, la declaraciónstatic const char __func__[] = "function-name";
apareció, donde nombre-función es el nombre de la función que encierra léxicamente.
UB? ¿Error? ¿O algo mas?
Standard no dice nada al respecto explícitamente
Esto significa un comportamiento indefinido.
De la norma C (énfasis mío):
(C99, 4.p2) "Si se viola un requisito '''' debe '''' o '''' no '''' que aparece fuera de una restricción, el comportamiento no está definido. El comportamiento indefinido se indica de otra manera en esta Norma Internacional con las palabras '' "comportamiento indefinido" o por la omisión de cualquier definición explícita de comportamiento. No hay diferencia en el énfasis entre estos tres; todos describen "comportamiento que no está definido".
(Promovido de un comentario anterior)
__func__
está en el espacio de nombres reservado, por lo que la implementación puede usarla en el ámbito del espacio de nombres para cualquier propósito, es decir, la implementación no es necesaria para diagnosticar un (mal) uso de __func__
fuera de una función, porque nada en la norma prohíbe una implementación definiendo __func__
como una matriz de espacios de espacio de nombres de char
si eso es lo que los implementadores quieren hacer.
Podría estar indefinido, o podría definirse como una cadena, o como cualquier otra cosa, y esa implementación aún está en conformidad.
Por lo tanto, es un comportamiento indefinido tratar de usarlo fuera de una función porque puede o no estar definido y puede ser o no del tipo correcto para ser utilizable.
Para ejemplos concretos de cómo el código en la pregunta podría tener un comportamiento indefinido cuando se usa con una implementación conforme, creo que una implementación podría definirlo como nullptr
(por lo que el ejemplo se bloquearía en printf
) o incluso podría definirlo en una macro que se expanda a una desreferencia de un puntero nulo y luego #undef
en la entrada a cada función y #define
después de cada función (¡así que el ejemplo fallaría antes de que comience el main
!)