significado online c++ function inline

c++ - online - Enlace de función en línea



inline function matlab (3)

Cuando la función en el encabezado no está en línea, entonces múltiples definiciones de esta función (por ejemplo, en múltiples unidades de traducción) son una violación de las reglas ODR.

Las funciones en línea por defecto tienen un enlace externo. Por lo tanto, como consecuencia de las reglas ODR (que se indican a continuación), tales definiciones múltiples (por ejemplo, en unidades de traducción múltiples) están de acuerdo:

$ 3.2 / 5- "Puede haber más de una definición de un tipo de clase (Cláusula 9), tipo de enumeración (7.2), función en línea con enlace externo (7.1.2), plantilla de clase (Cláusula 14), plantilla de función no estática (14.5.6), miembro de datos estáticos de una plantilla de clase (14.5.1.3), función miembro de una plantilla de clase (14.5.1.1), o especialización de plantilla para la cual no se especifican algunos parámetros de plantilla (14.7, 14.5.5) en un programa siempre que cada definición aparezca en una unidad de traducción diferente y que las definiciones cumplan con los siguientes requisitos. Dado que dicha entidad llamada D se define en más de una unidad de traducción, entonces

- cada definición de D consistirá en la misma secuencia de tokens; y [...]

La forma en que el vinculador trata las funciones en línea es un detalle de nivel de implementación. Basta con saber que la implementación acepta tales definiciones múltiples dentro de las limitaciones de las reglas ODR.

Tenga en cuenta que si la declaración de función en el encabezado se cambia a ''estática en línea ...'', entonces la función en línea tiene explícitamente un enlace interno y cada unidad de traducción tiene su propia copia de la función en línea estática.

No puedo entender el siguiente comportamiento: un encabezado con algunos tipos básicos y otro encabezado en el que uso estos tipos en varias funciones. Después comencé a construir clases basadas en mis tipos y funciones definidas. En el encabezado de la función si dejo la siguiente firma:

void whateverFunction(parameters)

El enlazador señala que hay múltiples definiciones de cualquier función. Ahora si lo cambiamos a:

inline void whateverFunction(parameters)

El problema de vinculación ha desaparecido y todos se compilan y enlazan bien. Lo que sé con respecto a la línea es que reemplaza cada llamada de función con su código aparte de que es bastante oscuro, así que mi pregunta es:

¿Cómo trata el enlazador las funciones en línea en C ++?


El enlazador puede no ver funciones en línea en absoluto. Por lo general, se compilan directamente en el código que los llama (es decir, el código se usa en lugar de una llamada de función).

Si el compilador elige no incluir la función en línea (ya que no es más que una sugerencia), no estoy seguro, pero creo que el compilador la emite como una función normal no en línea y de alguna manera la anota, por lo que el enlazador simplemente elige la primera copia. Ve e ignora a los demás.


La línea simplemente enmascara el problema. Tener múltiples definiciones señala un problema en alguna parte.

Juste ten cuidado con la forma en que usas tus encabezados. No olvide: - << #ifndef HEADER_NAME / #define HEADER_NAME / #endif >> para evitar la inclusión múltiple. - No utilice la inclusión indirecta: si usa un tipo en un archivo, agregue el encabezado correspondiente, incluso si otro encabezado en el mismo archivo lo incluye.