2010-10-21 21 views
10

Solía ​​trabajar con math.h sin ningún problema. Ahora, uso una biblioteca externa que tiene un archivo llamado math.h, pero que incluye < cmath>.cmath.h y errores de compilación

La adición de esta biblioteca para mi proyecto (o incluso sólo añadir el directorio incluyen, sin tocar el código) ahora genera toneladas de errores de < cmath>:

C: \ Archivos de programa \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): error C2039: 'acosf': no ​​es miembro de '`espacio de nombres global' '

C: \ Archivos de programa \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): error C2873: 'acosf': el símbolo no se puede utilizar en una declaración de uso

C: \ Program Files \ Micr osoft Visual Studio 8 \ VC \ include \ cmath (18): error C2039: 'asinf': no ​​es miembro de '`espacio de nombres global' '

C: \ Archivos de programa \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): error C2873: 'asinf': símbolo no se puede utilizar en una declaración usando-

[etc, etc ...]

no entiendo por qué sucede esto. Estoy usando Visual Studio 2005 y buscando en Internet, parece que este problema se resuelve en VS 2008. Sin embargo, me gustaría permanecer en VS 2005 ...

Incluyendo using namespace std; en todas partes, o cambiando el orden de mi inclusión no parece cambiar nada. La definición de _STD_BEGIN resuelve el error, pero produce el mismo número en < xlocinfo>.

¿Cómo se puede resolver esto?

+0

cmath para ser utilizado desde el código C++. ¿Está incluyendo este encabezado de un archivo C? –

+0

de hecho, uno de mis archivos en mi proyecto está en C y se incluye con la opción "C". Incluye "math.h", que luego se encuentra en el directorio de inclusión de mi biblioteca externa, e incluye implícitamente cmath; por lo tanto, no sé cómo solucionarlo. Sin embargo, estos errores de compilación parecen ocurrir incluso antes en mi código, antes de compilar este código C. – WhitAngl

+0

cambiando esta pieza particular de código C a C++ no parece cambiar todos los errores de compilación de cmath ... – WhitAngl

Respuesta

4

No estoy seguro de haber leído su pregunta correctamente, pero parece extraño que una biblioteca envíe su propio archivo math.h.

Quizás se supone que debe colocar el directorio principal en su ruta de inclusión para que <my_lib/math.h> se pueda incluir sin entrar en conflicto con su compilador <math.h>? existe

12

mismo problema en VC 10. Creo, que incluye <cmath> sí mismo un math.h pero insted de la correcta, que se incluye con el CV que utiliza el que se crea en el proyecto de usuario (con diferentes contenidos del curso)

Solución: Nunca use un Archivo llamado math.h en su Proyecto ... (O corrija el estándar en alguna parte).

+1

Después de 2 horas de arrancarme el pelo, tu comentario me hizo ver que tengo un Math.h en mi proyecto, que incluso con diferentes conflictos de mayúsculas y minúsculas con math.h de std. Cambiar el nombre de mi Math.h a MathExtensions.h resolvió el problema. ¡Gracias! – KomodoDave

+0

Ahora "Matemáticas" va en mi breve lista "Los archivos fuente nunca deben llamarse así". (Tengo una lista más larga de "los archivos fuente nunca deben tener nombres que incluyan esta cadena" que contiene "Error", "Advertencia" y "Falló"). – davidbak

+0

El problema está presente en VS 2015 y VS 2017 RC. Renombrar Math.h en ProjectnameMath.h lo resuelve. –

0

El problema probablemente sea la mezcla de bibliotecas C con las convenciones C++. Por ejemplo:

#include <math.h> 
namespace TEST { 
} 

Este compila bien, mientras que:

namespace TEST { 
    #include <math.h> 
} 

Esto genera un gran número de errores espurios.

Sólo para confundir el tema:

#include <math.h> 
namespace TEST { 
    #include <math.h> 
} 

Esto también compila, ya que sólo puede incluirse una vez (la primera vez).

De ahí también:

#include <math.h> 
namespace TEST { 
    #include "SomethingThatIncludesMath.h" 
} 

va a funcionar, mientras que:

namespace TEST { 
    #include "SomethingThatIncludesMath.h" 
} 

no lo hará.

También puede obtener problemas similares al incluir encabezados de C++ en un archivo * .c, en lugar de un archivo * .cpp.

Estoy seguro de que otras mezclas similares de C y C++ pueden provocar problemas similares.

0

(1) Según Microsoft, el C2873 significa;

'symbol': el símbolo no se puede usar en una declaración de uso A una directiva using le falta una palabra clave de espacio de nombres. Esto hace que el compilador malinterprete el código como una declaración de uso en lugar de una directiva using.

(2) También cuando tenía C2873 con C2039 (intenté fusionar CEF3 y Cinder), de algún modo evité ambos errores cambiando Propiedades-> Propiedades de configuración-> C/C++ -> Generación de código;

Habilitar regeneración mínima: Sí (/ g), Activar C++ Excepción: Si (/ EHsc), Habilitar función de nivel de vinculación: se supone vacía

Cuestiones relacionadas