C++: Errores de linking generados por el uso de inline

Cuando queremos que una función C++ sea inline, o sea, que sus llamadas sean reemplazadas en tiempo de compilación por su código a fin de evitar el overhead de la llamada, podemos definir la función dentro de la declaración de la clase y anteponer la palabra reservada inline. De todas formas, eso es sólo un "consejo" para el compilador, quien decidirá si le conviene o no.

Si nos molesta tener que definir en el .h, podemos sólo declarar la función ahí sin la palabra reservada inline, y definirla en el .cpp conla palabra reservada inline.

Hasta acá, todo bien. Pero puede haber problemas: si usamos inline en el cpp, y queremos usar esa función desde otra unidad de compilación (otro .cpp), nos saltará un error de link diciendo algo como que no logra encontrar la definición de la función.

En este caso, si insistimos con usar inline, tenemos dos opciones:

  1. Poner la definición en el .h, pero afuera de la declaración de la clase. Esto evita desordenar su interfaz. Por ejemplo:
    class A{
    public:
       inline void foo();
    };
     
    void A::foo(){
       //do stuff
    }
  2. Lo mismo que arriba, pero mover las definiciones a un archivo aparte, con extensión .inl por ejemplo, y hacer un #include del mismo al final del .h.

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x