prototipo parametros funciones funcion ejemplos declaracion creacion con c++ c c++11 c99 c11

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 forma static 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ón static 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 !)