Enlace de función en línea

No puedo entender el siguiente comportamiento: un encabezado con algunos tipos básicos y otro encabezado en el que utilizo estos tipos en varias funciones. Después comencé a construir clases basadas en mis tipos y funciones definidos. 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 cambias a:

 inline void whateverFunction(parameters) 

el problema de vinculación se ha ido y todos comstackn y enlaces bien. Lo que sé sobre inline 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 ++?

Cuando la función en el encabezado no está en línea, múltiples definiciones de esta función (por ejemplo, en múltiples unidades de traducción) es 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 de ODR (dadas a continuación), tales definiciones múltiples (por ejemplo, en múltiples unidades de traducción) están bien:

$ 3.2 / 5- “Puede haber más de una definición de 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 que no se especifican algunos parámetros de plantilla (14.7, 14.5.5) en un progtwig siempre que cada definición aparezca en una unidad de traducción diferente, y siempre que las definiciones satisfagan los siguientes requisitos: dada una entidad llamada D definida 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 prácticamente 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 statement de la función en el encabezado cambia a ‘estática en línea …’, entonces la función en línea tiene explícitamente una vinculación interna y cada unidad de traducción tiene su propia copia de la función estática en línea.

El vinculador puede no ver funciones en línea en absoluto. Por lo general, se comstackn 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 comstackdor elige no alinear la función (ya que no es más que una pista), no estoy seguro, pero creo que el comstackdor la emite como una función normal no en línea y de alguna manera la anota para que el vinculador solo elija la primera copia ve e ignora a los demás.

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

Juste tenga cuidado con la forma en que usa sus encabezados. No te olvides de: – << #ifndef HEADER_NAME / #define HEADER_NAME / #endif >> para evitar la inclusión múltiple. – No use inclusión indirecta: si usa un tipo en un archivo, agregue el encabezado correspondiente, incluso si otro encabezado en el mismo archivo lo incluye.