2010-10-21 8 views
10

Je travaillais avec math.h sans problème. Maintenant, j'utilise une bibliothèque externe qui elle-même a un fichier appelé math.h, mais qui comprend < cmath>.cmath.h et compiler les erreurs

L'ajout de cette bibliothèque à mon projet (ou même simplement d'ajouter le répertoire include, sans toucher le code) génère maintenant des tonnes d'erreurs de < cmath>:

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): erreur C2039: 'acosf': n'est pas membre de '' global namespace ''

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): erreur C2873: 'acosf': le symbole ne peut pas être utilisé dans une déclaration d'utilisation

C: \ Program Files \ Micr osoft Visual Studio 8 \ VC \ include \ cmath (18): erreur C2039: 'asinf': n'est pas membre de '' global namespace ''

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): erreur C2873: 'asinf': symbole ne peut pas être utilisé dans une déclaration à l'aide-

[etc, etc ...]

Je ne comprends pas pourquoi cela se produit. J'utilise Visual Studio 2005 et en regardant sur Internet, il semble que ce problème est résolu sous VS 2008. Cependant, je voudrais rester sur VS 2005 ...

Y compris partout, ou en changeant l'ordre de mes inclusions ne semblent pas changer quoi que ce soit. Définir _STD_BEGIN résout l'erreur, mais en produire autant en < xlocinfo>.

Comment cela peut-il être résolu?

+0

cmath est censé être utilisé à partir du code C++. Incluez-vous cet en-tête d'un fichier C? –

+0

en effet un de mes fichiers dans mon projet est en C et inclus avec extern "C". Il inclut "math.h" qui se trouve alors dans le répertoire include de ma bibliothèque externe, et inclut implicitement cmath - je ne sais donc pas comment corriger cela. Cependant, ces erreurs de compilation semblent se produire encore plus tôt dans mon code, avant de compiler ce code C. – WhitAngl

+0

changer cette partie particulière du code C en C++ ne semble pas changer toutes les erreurs de compilation de cmath si ... – WhitAngl

Répondre

4

Je ne suis pas sûr d'avoir bien lu votre question, mais il semble étrange qu'une bibliothèque envoie son propre fichier math.h.

Peut-être que vous êtes supposé mettre le répertoire parent dans votre chemin d'inclusion afin que <my_lib/math.h> puisse être inclus sans conflit avec votre compilateur <math.h>?

12

Même problème existe dans VC 10. Je pense, que <cmath> comprend lui-même un math.h mais insted de la bonne, qui est livré avec VC il utilise celui qui est créé dans le User-Project (avec un contenu différent bien sûr).

Solution: N'utilisez jamais un fichier nommé math.h dans votre projet ... (ou corrigez le fichier std quelque part).

+1

Après 2 heures de déchirer mes cheveux, votre commentaire m'a fait repérer j'ai un Math.h dans mon projet, qui même avec des conflits de capitalisation différents avec math.h de std. Renommer à Math.h MathExtensions.h résolu le problème. Je vous remercie! – KomodoDave

+0

Maintenant "Math" va sur ma courte liste de "fichiers source ne devraient jamais être nommés". (J'ai une plus longue liste de "fichiers source ne devraient jamais avoir des noms qui incluent cette chaîne" qui contient "Erreur", "Attention", et "Échec".) – davidbak

+0

Le problème est présent sur VS 2015 et VS 2017 RC. Renommer Math.h en ProjectnameMath.h le résout. –

0

Le problème est probablement le mélange de bibliothèques C avec des conventions C++. Par exemple:

#include <math.h> 
namespace TEST { 
} 

Cette compile bien, alors que:

namespace TEST { 
    #include <math.h> 
} 

Cela génère un grand nombre d'erreurs parasites.

Juste Confondre la question:

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

Cette compile également car il ne peut être inclus une fois (la première fois).

De là aussi:

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

fonctionne, alors que:

namespace TEST { 
    #include "SomethingThatIncludesMath.h" 
} 

Will not.

Vous pouvez également obtenir des problèmes similaires en incluant des en-têtes C++ dans un fichier * .c plutôt qu'un fichier * .cpp.

Je suis sûr que d'autres mélanges similaires de C et C++ peuvent conduire à des problèmes similaires.

0

(1) Selon Microsoft, le C2873 signifie; 'Symbole': le symbole ne peut pas être utilisé dans une déclaration d'utilisation. Une directive using manque un mot-clé d'espace-nom. Cela provoque le compilateur à interpréter le code comme une déclaration using plutôt qu'une directive using.

(2) Aussi quand j'avais C2873 avec C2039 (j'ai essayé de fusionner CEF3 et Cinder), j'ai contourné l'erreur en changeant Propriétés-> Propriétés de configuration-> C/C++ -> Génération de code;

Activer Minimal Rebuild: Oui (/ Gm), Activer C++ Exception: Oui (/ EHsc), Activer la fonction de niveau liaison: vide

Questions connexes