tutorial funciones funcion español clases c++ static compiler-errors solaris inline

c++ - funciones - Diferencia entre una función en línea y una función en línea estática



funciones inline en clases c++ (1)

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

La regla de una definición requiere que el cuerpo de la definición de la función sea idéntico en cada TU que lo contenga, con una definición bastante larga de "idéntico". Por lo general, esto se cumple siempre que los archivos de origen utilicen todos el mismo encabezado y que la función no utilice ningún nombre global con enlace interno (incluidas las funciones static ) o macros definidas de manera diferente en diferentes TU.

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

La declaración de función en static inline refiere a una función diferente en cada unidad de traducción, que por casualidad tiene el mismo nombre. Puede usar nombres globales static o macros que son diferentes en TU diferentes, en cuyo caso la función podría comportarse de manera diferente en las diferentes TU, incluso aunque su definición en el archivo de encabezado "tenga el mismo aspecto".

Debido a esta diferencia, si la función contiene variables locales static , entonces se comporta de manera diferente según sea static o no. Si es static , 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 está en inline , entonces solo hay una copia de las variables locales static utilizadas por todas las TU.

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

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

Estoy haciendo esta pregunta porque tengo una función en línea para la que tengo 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 algunos de mis mayores me dijeron que intentara con la línea estática. A continuación se muestra 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 debe hacerse solo en la TU particular donde se define.

Dado que mi función está en un archivo de encabezado y si lo hago estático, ¿será el caso de que siempre que incluya ese archivo de encabezado se pueda usar la función estática en esa unidad de traducción?