2011-05-05 4 views
0

Je suis nouveau à l'objectif C.Macros-> Objectif C

#define DECLARE_RS232_NEWMSG(ClassID) 

    enum {ID = ClassID}; 

    @interface data_derived : data { 

    @public 
    DECLARE_RS232_NEWMSG(RM_REQUEST_SESSION) //RM_REQUEST_SESSION = 0x11 declared as enum(which is a const) 

    } 

    @end 

Error:'ClassID undeclared here'

pourquoi cette erreur.

Répondre

2
An enumeration consists of a set of named integer constants 

L'ID de classe n'est pas un droit constant?

Nous pouvons donner

enum {ID = 0}; 

nous pouvons aussi donner

nous ne pouvons pas

enum {ID = ClassID}; 

parce ClassID est pas un constant..See this et this lien

EDIT: Après avoir vu le commentaire

Au lieu de définir ClassID dans la fonction macro, renvoie la valeur onformément de la macro et attribuer cette valeur à macro ClassID dans le fichier lui-même .. Voyez comme je l'ai fait une exemple here..It est un C code..but logique de préprocesseur pour objectif C est similaire ..

#define max(A,B) ((A) > (B) ? (A):(B)) 
#define MYVAL max(2,3) 

enum{ 
    FIRSTVALUE = MYVAL, 
    OTHERTHING 
}; 

void main(){ 
printf("%d and %d",SOMETHING,OTHERTHING); 
return; 
} 

Hope this helps ..

+0

@Krishnabhadra: J'ai édité mon code.Veuillez voir ce qui doit être changé.ClassID est déclaré comme constante seulement. – Angus

+0

Quelle est votre exigence..ce que DECLARE_RS232_NEWMSG fait – Krishnabhadra

+0

ID = ClassID (ClassID prendra tout IDValue eg.RM_REQUEST_SESSION = 0x11 ou RM_RESPONSE = 0x12 od RM_RES = 0x13 cette valeur est passée par DECLARE_RS232_NEWMSG (ClassID) macro) .Mon exigence est de récupère la valeur any de l'identifiant du message passé lors de l'exécution. – Angus

0

Eh bien, parce que ClassID n'est probablement pas déclaré là. La définition de la macro ne s'étend que jusqu'à la fin de la ligne (sauf si la fin de la ligne est \), donc votre seconde ligne est et non partie de la déclaration de macro et donc les arguments formels de la macro n'y sont pas définis. En d'autres termes, vous venez de déclarer une macro DECLARE_RS232_NEWMSG qui s'est agrandie et qui a tenté de déclarer un ID de constante symbolique (global) à l'aide de la valeur non définie ClassID.

+0

@interface data_derived: données { \t @publicDECLARE_RS232_NEWMSG (RM_REQUEST_SESSION) } J'ai défini RM_REQUEST_SESSION = 0x11 enum dans un autre fichier, je ne fais que passer le ClassID et pas le ClassName ici. Avec ceci je passe le ClassId mais toujours j'obtiens la même erreur. – Angus