2010-09-21 9 views
7

Tengo un espacio de nombres con función en línea que se utilizará si varios archivos de origen. Al intentar vincular mi aplicación, la función en línea se informa como símbolos duplicados. Parece que mi código simplemente no alinearía las funciones y me preguntaba si este es el comportamiento esperado y la mejor forma de lidiar con él.función en línea en el espacio de nombres generar símbolos duplicados durante el enlace en gcc

que utilice las siguientes opciones: gcc -g -Wextra -pedantic -Wmissing-campo-inicializadores -Wredundant-decls -Wfloat-igual--Wno reordenación -Wno-largo tiempo El mismo estilo de código parece compilar y enlace correctamente cuando se construye en un entorno VC7.

El ejemplo de código siguiente muestra la estructura del código:

/* header.h */ 
namespace myNamespace { 
inline bool myFunction() {return true;} 
} 

/* use_1.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 

/* use_2.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 
+1

¿Está bien una variable global en cada archivo cpp? Eso causaría un error de símbolo duplicado. Suponiendo que no es global, su ejemplo es legal C++. Intenta compilar con -Winline. ¿Qué versión de gcc estás usando? –

+1

Publique el mensaje del compilador real. ¿Se produce el error con un mínimo de archivos fuente (solo las líneas mencionadas sin las cosas implícitas en ...)? –

+1

Una vez que cambié uno de los nombres de 'OK' a' OK1', agregué una función 'main' vacía y eliminé el' ... '; compilar ambos archivos con las opciones que proporcionó funcionó correctamente para mí. Necesita publicar más detalles ya que la causa de su error no está aquí. –

Respuesta

-1

La palabra clave en línea se toma solamente como una pista por el compilador. Si el compilador decide que la función funcionaría mejor sin estar en línea, no la alineará. Hay palabras clave específicas del proveedor que hacen que el compilador en línea sea una función: es __attribute__((always_inline)) para GCC y __forceinline para Visual C++.

Si realmente quiere asegurarse de que su función no esté causando errores de enlazador en todos los casos en todos los compiladores estándar, puede querer convertirla en plantilla, ya que se garantiza que las funciones de plantilla no causarán errores de enlazador aunque estén definidas en encabezados . Esto es, sin embargo, completamente innecesario para funciones realmente simples.

+2

Su código no causa errores de enlazador si lo escribe correctamente. Escribir plantillas donde no se necesitan es una tontería. –

+1

Si un compilador de C++ enlista una función o no no es importante aquí. El compilador maneja esto de manera transparente bajo la regla de si. Sin embargo, 'en línea' afecta la semántica del programa. Aquí es apropiado, independientemente de si el compilador realmente enlista la función. Investigue la "regla de una definición". – sellibitze

+0

SOLUCIONADO: Finalmente tuve tiempo de rastrear el problema hasta sus raíces y (como muy a menudo) era un problema de coherencia simple con el uso de encabezados precompilados. Aprendí que el uso de inline es de hecho transparente y no requiere tener cuidado si el compilador realmente alinea la función o no. Y lo más importante: siempre use el indicador -Winvalid-pch cuando use encabezados precompilados. – doberkofler

Cuestiones relacionadas