código mínimo:¿Es un comportamiento indefinido tener diferentes definiciones de una función en línea?
// --------inline.h--------
struct X {
static inline void foo();
};
#ifdef YES
inline void X::foo() { cout << "YES\n"; }
#else
inline void X::foo() { cout << "NO\n"; }
#endif
// --------file1.cpp--------
#define YES // <----
#include"inline.h"
void fun1()
{
X::foo();
}
// --------file2.cpp--------
#include"inline.h"
void fun2()
{
X::foo();
}
Si llamamos fun1()
y fun2()
, entonces van a imprimir y YES
NO
respectivamente, lo que significa que se están refiriendo diferentes cuerpos de las funciones del mismo X::foo()
.
Independientemente de esto debe codificarse o no, mi pregunta es:
¿Es este un comportamiento bien definido o indefinido?
Si desea tener dos funciones libres diferentes (no miembros de clase) en dos archivos diferentes pero con el mismo nombre, puede aislarlos con la palabra clave 'static' (o un espacio de nombre anónimo). Marcar una función en file2.cpp como estática significa que ningún otro archivo .cpp puede verla durante la vinculación. Eso es útil para programas muy grandes en los que no siempre se puede estar seguro de qué nombres comunes ya han sido asumidos por las funciones. – Crashworks
Realmente no necesita inline.h y el #define hack en este caso; simplemente defina "void X :: foo()" (con o sin la línea) de una manera en file1.cpp, y la otra en file2.cpp, y tendrá exactamente el mismo comportamiento. – abarnert
@abarnert: Omitir los resultados 'en línea' en una violación diferente de la regla de una definición. Las funciones no en línea están cubiertas por 3.2 párrafo 3, funciones en línea por 3.2 párrafo 5. Muchos (¿la mayoría?) Enlazadores atrapan las violaciones no en línea. El mío al menos no detecta las violaciones en línea. –