2010-11-10 5 views
7

de acuerdo con una regla de definición (ODR) no puede tener una función¿Cómo es una situación en la que diferentes implementaciones de una función en línea están vinculadas en un ejecutable clasificado?

void function() 
{ 
} 

definido más de una vez en un ejecutable - enlazador se opondrá. Sin embargo ODR se ignora para las funciones en línea:

inline void function() 
{ 
} 

se puede definir en un archivo de cabecera que será #include en varios archivos .cpp y así, cuando resultantes archivos .obj están unidos entre sí el enlazador ve que hay varios instancias de esa función e intencionalmente ignora eso. Es se supone que es la misma función y simplemente utiliza una de las instancias. Como el comportamiento del programa está preservado, a nadie le importa.

Pero si gracias a cualquier razón, use of preprocessor included, esos casos sucede que tiene diferentes implementaciones del enlazador volverá a escoger una de las funciones y el desarrollador ni siquiera saben cuál es captada hasta que se pone a prueba a fondo su programa.

¿Cómo es la última situación cuando el vinculador elige una de las funciones y tienen diferentes implementaciones clasificadas? ¿Es este comportamiento indefinido o cualquier otro tipo de situación?

+1

La respuesta corta: Broken. – BCS

Respuesta

6

Sí, es UB para funciones en línea con enlace externo (creo que eso es lo que pretende el OP).

$ 3,2/5-

No puede haber más de una definición de un tipo de clase (cláusula 9), tipo enumeración (7.2), en línea función con enlace externo (7.1.2) , plantilla de clase (cláusula 14), plantilla de función no estática (14.5.5), , plantilla de clase no estática (14.5.5 especialización para la cual algunos parámetros de la plantilla no son t especificado (14.7, 14.5.4) en un programa siempre que cada definición aparezca en una unidad de traducción diferente, y siempre que las definiciones cumplan los siguientes requisitos .

Dada una entidad tal llamado D define en más de una unidad de traducción, entonces

- cada definición de D se consistir en la misma secuencia de tokens; y

El mismo párrafo al final establece que el incumplimiento de estos requisitos conduce a UB

+0

No use la palabra 'para' significa algo completamente diferente al párrafo. –

+0

@Matt Joiner: Lo he cambiado. Discúlpate si significa algo no deseado. – Chubsdad

Cuestiones relacionadas