2012-02-16 24 views
16

La norma dice que recibió la declaración de¿Por qué las funciones en línea tienen enlaces externos por defecto?

inline void foo(); 

que es un fooinline function with external linkage (porque por defecto todas las declaraciones de función tienen enlace externo). Esto me parece extraño. porque la regla de definición de sección 3.2 (en C++ 03 y C++ 11) dice:

3 ... Se debe definir una función en línea en cada unidad de traducción en la que se utiliza.

5 Puede haber más de una definición de una [n] ... función en línea con enlace externo (7.1.2) ... Dada una entidad llamada D definida en más de una unidad de traducción ... cada una definición de D consistirá en la misma secuencia de tokens

Esto significa que una función en línea bien podría haber enlace interno, porque el uso de la función en cualquier camino a través de la vinculación externa (es decir, a través de unidades de traducción) haría invocar un comportamiento indefinido (en el párrafo 3) y que el contenido de la función en línea en todas las unidades de traducción debe ser el mismo.

¿Existe una compatibilidad hacia atrás o una razón de cadena de herramientas específica para esta regla?

+0

Creo que [esto] (http://www.glenmccl.com/ansi_015.htm) responde la pregunta. –

+0

@Als: Eso discute las trampas, pero no la razón por la cual se realizó ese cambio. –

+0

Si lo leyó por completo, dice: * "La motivación inmediata para este cambio fue la necesidad del nuevo modelo de compilación de plantillas que se adoptó en la misma reunión, pero en general se consideró que cambiar el valor predeterminado era una idea cuyo tiempo había llegado, y el cambio fue aprobado por unanimidad tanto en ANSI como en ISO "*. –

Respuesta

17

Uno de los resultados de esa decisión es que una variable estática definida dentro de una función en línea se compartirá entre todas las instancias de la función. Si el valor predeterminado hubiera sido el enlace interno, cada unidad de traducción habría obtenido su propia copia de la variable estática. Esa no es la forma en que las personas esperan que las cosas funcionen: en línea versus no en línea no debería afectar la semántica del código de manera tan drástica.

9

Esto es acertadamente respondido aquí por el artículo de Jonathan Schilling: Extern Inlines By Default.

Para citar él acerca de la motivación para este cambio:

La motivación inmediata de este cambio fue la necesidad del nuevo modelo de compilación plantilla que fue adoptada en la misma reunión; pero, en términos más generales, se consideró que cambiar el valor predeterminado era una idea cuyo momento había llegado, y el cambio se aprobó por unanimidad tanto en ANSI como en ISO.

Cuestiones relacionadas