web-dev-qa-db-fra.com

Identifiant non qualifié attendu avant la constante numérique pour définir un nombre

Je suis nouveau en C++, donc je ne sais pas ce qu'ils signifient avec cette erreur dans un exemple de code phidget:

Main.cpp: 8: 16: erreur: identifiant non qualifié attendu avant la constante numérique

//verander de volgende informatie naar de informatie voor jouw database

#define dserver "oege.ie.hva.nl"
#define duser "username"
#define dpassword "password"
#define ddatabase "databasename"

#define homeid 1234 //line 8

Y a-t-il une erreur de syntaxe? Ou autre chose? J'utilise #define au lieu de int.

EDIT: ajout d'un journal d'erreurs complet.

journal des erreurs complet: http://Pastebin.com/3vtbzmXD

Code main.cpp complet: http://Pastebin.com/SDTz8vni

22
Kil'jaeden

L'erreur complète est

error: expected unqualified-id before numeric constant
 note: in expansion of macro ‘homeid’
string homeid;
       ^

Vous essayez de déclarer une variable avec le même nom qu'une macro, mais cela ne peut pas être fait. Le préprocesseur a déjà piétiné le programme, le transformant en string 1234;, qui n'est pas une déclaration valide. Le préprocesseur n'a aucune connaissance de la structure du programme et les macros ne suivent pas les règles de portée du langage.

Dans la mesure du possible, utilisez des fonctionnalités de langage comme des constantes et des fonctions en ligne plutôt que des macros. Dans ce cas, vous pouvez utiliser

const int homeid = 1234;

Cela sera limité à l'espace de noms global et peut être caché en toute sécurité par quelque chose du même nom dans une portée plus étroite. Même lorsqu'il est masqué, il est toujours disponible en tant que ::homeid.

Lorsque vous avez vraiment besoin d'une macro, il est sage de suivre la convention d'utilisation de SHOUTY_CAPS pour les macros. En plus d'attirer l'attention sur les dangers potentiels et les bizarreries associés à l'utilisation des macros, il ne heurtera aucun nom utilisant une autre majuscule.

22
Mike Seymour

Cette ligne est très bien.

Ce qui se produit le plus probablement, c'est que le compilateur se plaint non pas de la définition de la macro elle-même, mais de tilisation de la macro. Exemple:

#define homeid 1234

void homeid() {
}

En compilant cela avec GCC, j'obtiens:

 so.cc:1:16: erreur: id non qualifié attendu avant la constante numérique 
 #define homeid 1234 
 ^ 
 so.cc:3:6: note: dans l'expansion de la macro 'homeid' 
 void homeid () {
 ^ 

Cela vous indique que la constante numérique à l'origine de la réclamation fait partie de la définition de la macro, mais également que cette macro est tilisée (dans ce cas apparemment par accident) sur la ligne 3. Jetez un œil à l'endroit où la macro l'expansion vient de votre code.

8
user743382