En arcaico C y C ++, inline
es como register
: una sugerencia (nada más que una sugerencia) al compilador sobre una posible optimización.
En C ++ moderno, inline
le dice al enlazador que, si se encuentran múltiples definiciones (no declaraciones) en diferentes unidades de traducción, son todas iguales, y el enlazador puede conservar libremente una y descartar todas las demás.
inline
es obligatorio si una función (no importa cuán compleja o "lineal") se defina en un archivo de encabezado, para permitir que múltiples fuentes la incluyan sin que el vinculador obtenga un error de "definición múltiple".
Las funciones miembro definidas dentro de una clase son "en línea" de forma predeterminada, al igual que las funciones de plantilla (en contraste con las funciones globales).
//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }
//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }
//main.cpp
#include "fileA.h"
void acall();
int main()
{
afunc();
acall();
}
//output
this is afunc
this is afunc
Tenga en cuenta la inclusión de fileA.h en dos archivos .cpp, lo que da como resultado dos instancias de afunc()
. El enlazador descartará uno de ellos. Si no inline
se especifica, el vinculador se quejará.