2010-08-26 7 views
10

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.

+0

También obtendrá el comportamiento estándar si compila en el modo de estándares estrictos. –

Respuesta

18

C++ 03 §17.4.2.2/1 dice:

Entidades en la C++ biblioteca estándar tienen vinculación externa.

Lo mismo es cierto en C: C99 §7.1.2/6 dice:

Cualquier declaración de una función de biblioteca tendrá vinculación externa.

+2

+1: Me encantan las referencias al estándar – Chubsdad

0

¿Y si uso "cctype" (me refiero dentro de paréntesis) en lugar de "ctype.h" De todas formas, sería una cabecera de edad hospedado supongo.

+0

Estoy usando '' pero el error proviene de eso, incluido ''. –

+0

@Evan Teran: Háganos saber cómo resolvió este problema. – Chubsdad

+0

He archivado un informe de error con apple (https: // bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/9/wo/6aVZoNoJkJwq5qhwL0J7Bw/10.60). Mientras tanto, simplemente estoy usando una macro para llamar a la función directamente oa través de la plantilla en función de si se está compilando en OSX. No es una solución ideal, pero por ahora es lo suficientemente buena. –

3

El encabezado OS X <ctype.h> protege las versiones en línea no estándar con una comprobación de que no está compilando en modo estándar.

Si no le dice al compilador que desea la conformidad, no obtendrá la conformidad. Esto es cierto en casi todas las plataformas, aunque de diferentes maneras.

Si desea todas las sutilezas de extensiones y lo que no, y por lo tanto no desea exigir una estricta conformidad, puede definir _DONT_USE_CTYPE_INLINE_ antes de incluir el encabezado y obtendrá versiones no en línea de las funciones con enlace externo.

Cuestiones relacionadas