Así que tengo una aplicación que compila bien en Windows, Linux y algunas variaciones de Unix. Recientemente decidí portarlo a OSX cuando me encontré con un problema.¿Se requieren todas las funciones en la biblioteca estándar de C++ tienen un enlace externo?
que tienen una plantilla que se parece a esto:
template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }
con la idea de prevenir la extensión de signo de estrellarse ciertas implementaciones cuando se administra por encima de los valores de entrada 0x7f
. Normalmente se usa así:
safe_ctype<std::isspace>(ch);
Desafortunadamente, esto no funciona en OSX (con gcc 4.2). El error tiene que ver con std::isspace
que no tiene un enlace externo y, por lo tanto, no se aplica a las plantillas. Resulta que en OSX, el encabezado ctype.h
tiene todas las funciones (a través de macros) marcadas como static inline
.
Aquí es mi pregunta:
¿Está permitido por cualquier estándar relevante para las funciones en C++ (en este caso las partes heredado de la C) de la biblioteca estándar de no tener vinculación externa?
EDIT:
que he recibido noticias de manzana. Aparentemente tienen una macro para controlar este comportamiento. La definición de _DONT_USE_CTYPE_INLINE_
evita que las funciones ctype sean estáticas en línea.
También obtendrá el comportamiento estándar si compila en el modo de estándares estrictos. –