2009-09-14 10 views
13

¿Por qué recibo esta advertencia en Qt Creator: `función en línea 'bool Lion :: growl()' usado pero nunca definido?Qt Creator: "función en línea utilizada pero nunca definida" - ¿por qué?

Me doble comprobado mi código, y tienen una declaración

inline bool growl() en Lion (lion.h)

y la aplicación correspondiente en lion.cpp:

inline bool Lion::growl()

¿Qué está pasando?

EDIT: Mi suposición ha sido que es legal definir el método en línea real en el archivo .cpp (la palabra clave inline alerta al compilador que busque el cuerpo del método en otro lugar), o ¿me equivoco?

No quiero saturar mis archivos de encabezado con detalles de implementación.

+0

nota al margen: Lo que he aprendido es que las funciones en línea se implementan en el archivo de encabezado (o en un archivo independiente enl que se incluye en la parte inferior de un encabezado). – RvdK

Respuesta

26

Bueno, no sé el problema exacto, pero para empezar: se supone que los métodos

  • Inline a implementarse en el archivo de cabecera. El compilador necesita saber el código realmente en línea.
  • Usar también la palabra clave "en línea" en la declaración de clase no tiene ningún efecto. Pero tampoco puede lastimar.

Ver también: c++ faq lite

+3

Personalmente (y esto es una cuestión de gusto), I * odio * código que marca explícitamente código como en línea - ya sea con la palabra clave en línea, o poniendo la aplicación en el archivo de cabecera por 2 razones: 1) se rompe la encapsulación. 2) Duele rendimiento - sí, me escuchaste. ¿Quién crees que sabe si la incorporación de una mathod dará como resultado un impulso de rendimiento mejor: el compilador o el programador. En serio, confíen en sus optimizadores, hacen un mejor trabajo (en muchos casos, pero no en todos) y lo harán. – Thomi

+7

@Thomi si solo estoy creando un contenedor de 1 línea alrededor de una función, estoy bastante seguro de que es mejor que esté en línea. –

+0

Microsoft está diciendo que pueden conseguir un aumento de rendimiento grande en tiempos de enlace y la reducción de tamaño en librerías estáticas mediante la aplicación de esta regla: http://blogs.msdn.com/b/vcblog/archive/2014/09/26/feedback- making-zc-inline-default-for-debug-release-configs-in-14.aspx – bames53

1

Además de lo que dijo Johan, no se puede tener una definición independiente y declaración de la función, incluso si ambos están en el mismo archivo de cabecera. Esto es cierto especialmente para las funciones miembro de las clases. El código de función debe ser de la forma:

class someClass 
{ 
void someFunc() 
{ ... } 
} 
// This will make the function inline even w/o the explicit 'inline' 

no de la forma que se supone

class someClass 
{ 
public: 
    void someFunc(); 
} 

void someClass::someFunc() 
{ ... } 
+0

En realidad, puede tener una definición y declaración por separado: 'clase C {inline void f(); }; void C :: f() {} '. Solo tiene que usar '' inline' explícito en lugar de implícito. – bames53

3

métodos Inline a implementarse en el archivo de cabecera. El compilador necesita saber el código para realmente alinearlo.

excepto si la función en línea se utiliza en el mismo proyecto, posiblemente en otro archivo que # include su encabezado.

Echo de menos que exista tal restricción para las bibliotecas porque restringir los encabezados a los prototipos de función hace que las cosas sean más legibles.

¿Qué hay de #include -es el .cpp?

+0

C++ requiere "Se debe definir una función en línea en cada unidad de traducción en la que se usa odr". _n3337 basic.def.odr/3_ Eso significa esencialmente que cuando una función en línea se declara en un encabezado, también debe definirse en el encabezado. – bames53

Cuestiones relacionadas