12
votes

CMATH.H et compiler des erreurs

J'avais l'habitude de travailler avec Math.h sans aucun problème. Maintenant, j'utilise une bibliothèque externe qui a lui-même un fichier appelé math.h , mais qui inclut . .

Ajout de cette bibliothèque à mon projet (ou même en ajoutant simplement l'annuaire Inclure, sans toucher le code) génère désormais des tonnes d'erreurs à partir de : :

C: \ Fichiers de programme \ Microsoft Visual Studio 8 \ VC \ Inclure \ CMATH (18): Erreur C2039: 'ACOSF': n'est pas membre de "Espace de noms global"

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ Inclure \ CMATH (18): Erreur C2873: 'ACOSF': Symbole ne peut pas être utilisé dans une déclaration à l'aide de la déclaration

C: \ Fichiers de programme \ Microsoft Visual Studio 8 \ VC \ Inclure \ CMATH (18): Erreur C2039: 'Asinf': n'est pas membre de "Espace de noms global"

C: \ Fichiers de programme \ Microsoft Visual Studio 8 \ VC \ Inclure \ CMATH (18): Erreur C2873: 'Asinf': Symbole ne peut pas être utilisé dans une déclaration à l'aide d'une déclaration

[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 soit résolu sous VS 2008. Cependant, j'aimerais rester sur VS 2005 ...

y compris à l'aide d'un espace de noms std; partout ou changer l'ordre de mon inclus ne semble pas changer quoi que ce soit. Définitionner _std_begin résout l'erreur, mais produisez autant d'autant dans . .

Comment cela peut-il être résolu?


7 commentaires

Cmath est censé être utilisé à partir du code C ++. Es-tu compris cet en-tête d'un fichier C?


En effet, l'un de mes fichiers de mon projet est en C et inclus avec extern "c". Il inclut "Math.H" qui est ensuite trouvé dans l'annuaire Inclure de ma bibliothèque externe, et comprend implicitement CMATH - Je ne sais donc pas comment résoudre ce problème. Cependant, ces erreurs compilent semble se produire encore plus tôt dans mon code avant de compiler ce code C.


Changer ce morceau de code C particulier à C ++ ne semble pas changer toutes les erreurs de compilation de CMATH ...


Je ne suis pas sûr de lire votre message correctement mais il semble étrange qu'une bibliothèque expédierait son propre fichier Math.h. Peut-être êtes-vous supposé mettre le répertoire parent dans votre chemin Inclure de manière à ce que vous puissiez #include et éviter les conflits avec votre compilateur math.h ?


Alexandre: Bien sûr! Je n'ai pas réalisé que tous leurs fichiers d'en-tête avaient un chemin relatif dans la forme "my_lib / myheader.h" dedans! Merci beaucoup, cela a beaucoup de sens!


Je ne sais pas bien comment Stackoverflow fonctionne habituellement, mais vous pouvez copier coller ce commentaire comme une réponse formelle et je l'accepterai :)


Dans mon cas, j'ai eu cette erreur parce que VC a interprété mon fichier .C comme C, ce qui a du sens, j'aurais dû l'ajouter avec une extension .CPP depuis que j'utilise stl


4 Réponses :


6
votes

Je ne suis pas sûr de lire votre question correctement, mais il semble étrange qu'une bibliothèque expédierait son propre fichier math.h.

Vous êtes peut-être supposé mettre le répertoire parent dans votre chemin Inclure de sorte que peut être inclus sans conflict avec votre compilateur ?


0 commentaires

15
votes

Même problème existe dans VC 10. Je pense que inclut lui-même un math.h mais inscrit à la bonne, qui est expédié avec VC IT Utilise celui qui est créé dans le projet utilisateur (avec un contenu différent de cours).

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


3 commentaires

Après 2 heures de déchirement mes cheveux, votre commentaire m'a rendu compte que j'ai un math -.h dans mon projet, lequel même avec une capitalisation différente des conflits avec STD's Math.h. Renommer à mon Math.h à Mathextensions.h a résolu le problème. Merci!


Maintenant "Math" passe à mes petits fichiers sources "ne doit jamais être nommé cette" liste. (J'ai une liste plus longue des fichiers source ne doit jamais avoir de noms qui incluent cette chaîne "qui contient" Erreur "," Avertissement "et" Échec ".)


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



0
votes

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

namespace TEST {
  #include "SomethingThatIncludesMath.h"
}


0 commentaires

0
votes

(1) selon Microsoft, le C2873 signifie;

'symbole': le symbole ne peut pas être utilisé dans une déclaration d'utilisation Une directive utilise manque un mot-clé d'espace de noms. Cela entraîne mal interpréter le Compilateur le code comme une déclaration à l'aide de la directive à l'aide d'une directive.

(2) De plus, lorsque j'avais C2873 avec C2039 (j'ai essayé de fusionner le CEF3 et le center), j'ai contourné d'une manière ou d'une autre manière que j'ai contourné les deux erreurs en modifiant les propriétés-> Propriétés de configuration-> C / C ++ -> Génération de code;

Activer la reconstruction minimale: Oui (/ GM), Activer l'exception C ++: Oui (/ EHSC), activer la liaison au niveau de la fonction: vide


0 commentaires