2009-04-07 8 views
0

J'ai un petit problème avec une définition. Je veux l'assigner à une variable entière mais le compilateur dit qu'il n'est pas déclaré.C2065 identificateur non déclaré lors de l'affectation d'une définition à un int

Voici ce que le code ressemble à: defines.h

#ifndef DEFINES_H 
#define DEFINES_H 

#define MYDEFINE 2 

#endif 

MyClass.h

namespace mynamespace { 
class myClass { 
    int someFunction(); 
}; 
} 

myclass.cxx

#include "defines.h" 
#include "myclass.h" 
namespace mynamespace { 
int myClass::someFunction() { 
    int var = MYDEFINE; 
    return 0; 
} 
} 

Dans la ligne avec l'affectation int erreur de compilation a lieu. J'ai également essayé d'utiliser une autre définition, définie dans le même fichier d'en-tête que ci-dessus, comme un paramètre de fonction ayant le même effet. Des idées? Merci d'avance. Je sais que l'utilisation de define est une mauvaise habitude, mais je ne fais que prolonger un projet existant et j'essaie de rester dans leur conception.

EDIT: Le message d'erreur est simplement: Fehler 1 error C2065: 'MYDEFINE': nichtdeklarierter Bezeichner ... Comme vous pouvez le voir ce n'est pas le vrai code source, mais je pense que j'ai été très prudent lors de l'élaboration de la question.

EDIT2: Merci pour l'indice avec le #warning. Il y avait 2 fichiers avec le même nom dans différents dossiers. Je ne sais pas pourquoi le compilateur n'a pas soulevé cette question. Quoi qu'il en soit, cela fonctionne maintenant.

+0

S'il vous plaît inclure le message d'erreur exact que vous obtenez, parfois le diable est dans les détails. – unwind

Répondre

2

Vous devriez vérifier si est vraiment défini le symbole MYDEFINE.

Vérifiez si le fichier d'en-tête où est déclaré est réellement inclus (et compilé). Utilisez #WARNING près de la définir pour vous assurer qu'il est compilé pour myclass.cxx:

#ifndef DEFINES_H 
#define DEFINES_H 

#define MYDEFINE 2 
#warning My define is defined 

#endif 

Si elle ne compilait (vous ne trouverez pas le message d'avertissement dans le journal de compilation), faites une recherche DEFINES_H. Il pourrait être déjà défini ailleurs.

0

Un autre fichier d'en-tête utilise également DEFINES_H?

Un argument pour #pragma une fois ...

+0

Cela ne fait aucune différence, car vous rencontrez toujours des problèmes avec deux en-têtes "defines.h" dans un projet. – MSalters

+0

J'ajouterais que #pragma une fois spécifique à Microsoft, pas standard. –

+0

#pragma une fois n'est pas seulement MS, par ex. gcc l'implémente aussi. Il n'est pas reconnu par tous les préprocesseurs mais si vous êtes dans un environnement très diversifié, il ne sera pas utilisable. – danio

2

Mettons tous ensemble:

#ifndef DEFINES_H 
    #define DEFINES_H 
    #define MYDEFINE 2 
    #endif 

    namespace mynamespace { 
    class myClass { 
     int someFunction(); 
    }; // note ; missing in your code 
    } 

    namespace mynamespace { 
    int myClass::someFunction() { 
     int var = MYDEFINE; 
     return 0; 
    } 

Cette compile sans erreur, donc il y a quelque chose de mal dans vos #includes.

+0

+1 Belle prise. Les petites erreurs de syntaxe donnent généralement beaucoup de chagrin au compilateur et c'est une erreur classique. –

+0

Merci pour l'indice, j'ai oublié le; et aussi #include "myclass.h". – DaClown

1

Il se plaint probablement que vous n'avez pas déclaré votre classe. Essayez #including "MyClass.h"

Edit:

Oh, manquant ';' après votre déclaration de classe.

+0

heh heh, oh bien. Je ne devrais pas être aussi littéral avec un exemple de code, je suppose. – veefu

+0

+1 pour le signaler – DaClown

0

Vous devez voir ce que le préprocesseur est en train de faire avec votre code - essayez de compiler myclass.cxx avec l'option -P et d'examiner le fichier .i ainsi généré.

Questions connexes