2012-10-11 39 views
23

¿Alguien me puede decir cuál es la diferencia entre una función en línea y una función estática en línea?Diferencia entre una función en línea y una función en línea estática

¿En qué casos debería preferir la línea estática sobre la línea?

Estoy haciendo esta pregunta porque tengo una función en línea para la cual estoy enfrentando problemas de compilación durante el enlace (relocation error:... symbol has been discarded with discarded section ...). Lo hice una función normal y funcionó. Ahora algunas de mis personas mayores me dijeron que intentara con estática en línea. A continuación es mi función:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1) 
{ 
    wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name); 
    notifier->notify (arg, aspect); 
} 

y esto no dentro de una clase. ¡Esto está dentro de un archivo de encabezado!

Supongo que la llamada a una función estática solo debe realizarse en la TU particular donde está definida.

Dado que mi función está en un archivo de cabecera y si lo hago estático, ¿será el caso que siempre que incluyo ese archivo de cabecera, la función estática puede usarse en esa unidad de traducción?

+0

¿Esta función está dentro de una clase? Por favor, también publique su declaración. – anatolyg

+1

es ':: wizNtrKit' un objeto estático? ¿Cuál es su vínculo? – Walter

+0

Además, ¿dónde aparece la función? Archivo de encabezado, archivo de origen? ¿Cuántos archivos fuente lo incluyen? –

Respuesta

36

La declaración de función no estática inline se refiere a la misma función en cada unidad de traducción (archivo de origen) que lo utiliza.

La regla de una definición requiere que el cuerpo de la definición de función sea idéntico en cada TU que lo contenga, con una definición larga de "idéntico". Esto generalmente se cumple siempre que todos los archivos de origen utilicen el mismo encabezado y siempre que la función no utilice ningún nombre global con enlaces internos (incluidas las funciones static) ni macros que se definan de manera diferente en diferentes UT.

No recuerdo haber encontrado ese error de enlazador en particular, pero al menos es posible que una de estas restricciones sea la responsable. Es su responsabilidad satisfacer los requisitos: comportamiento no definido sin diagnóstico obligatorio si no lo hace.

La declaración de función static inline se refiere a una función diferente en cada unidad de traducción, que simplemente tiene el mismo nombre. Puede utilizar static nombres globales o macros que son diferentes en diferentes TU, en cuyo caso la función puede comportarse de manera diferente en las diferentes TU, aunque su definición en el archivo de encabezado "se ve igual".

Debido a esta diferencia, si la función contiene static variables locales, se comporta de manera diferente según si es static o no. Si es static, entonces cada TU tiene su propia versión de la función y, por lo tanto, su propia copia de las variables locales static. Si solo es inline, solo hay una copia de las variables locales static utilizadas por todas las TU.

+2

Nota: en el caso de funciones 'estáticas', el bit' en línea' pierde su significado semántico (* está bien si esa definición de función aparece en múltiples TU *); lo único que queda adjunto a 'en línea' es una mera insinuación para el compilador, que casi se ignora. –

+0

Sí, lo que digo acerca de la función 'en línea' también sería cierto para las declaraciones de funciones que no son' static' ni 'inline', excepto por el requisito de la regla de una sola definición.En lugar de requerir definiciones idénticas en cada TU, requeriría que solo una TU contenga una definición. Dado que el código de la persona que pregunta funciona cuando se elimina 'inline', sospecho que aquí sucede algo gracioso: esperarías un error del enlazador si está definido en múltiples TU. No creo que se requiera un diagnóstico, pero no es difícil para el vinculador. –

Cuestiones relacionadas