Objective c 宏->;目标C

Objective c 宏->;目标C,objective-c,macros,Objective C,Macros,我对目标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 错误:“此

我对目标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
错误:“此处未声明ClassID”


为什么会出现这个错误。

嗯,因为ClassID可能没有在那里声明。宏定义仅扩展到行尾(除非行尾用
\
转义),因此第二行不是宏声明的一部分,因此宏的形式参数不在此定义。换句话说,您刚刚声明了一个宏
DECLARE\u RS232\u NEWMSG
,它扩展为零,然后尝试使用未定义的值ClassID声明一个符号常量(全局)ID

An enumeration consists of a set of named integer constants
ClassID不是常数,对吗

我们可以给

enum {ID = 0};
我们也可以给

enum{ID} // now ID automatically assigned as 0
我们不能放弃

enum {ID = ClassID};
因为ClassID不是常数。请参阅和链接

编辑:在看到评论后

不是在宏函数中设置ClassID,而是从宏返回预期值,并将该值指定给文件本身中的ClassID宏。。 看看我是怎么做的,这是一个C代码,但目标C的预处理器逻辑是相似的

#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;
}

希望这有帮助。

@接口数据\u派生:数据{@public DECLARE\u RS232\u NEWMSG(RM\u REQUEST\u SESSION)}我已经在另一个文件中将RM\u REQUEST\u SESSION=0x11定义为enum;我在这里只传递ClassID,而不是ClassName。通过这个我传递ClassID,但仍然得到相同的错误。@Krishnabhadra:我已经编辑了我的代码。请查看需要更改的内容。ClassID仅声明为常量。您的要求是什么..这个声明是什么(ClassID将接受任何IDValue,例如RM_REQUEST_SESSION=0x11或RM_RESPONSE=0x12 od RM_RES=0x13此值通过DECLARE_RS232_NEWMSG(ClassID)宏传递)。我的要求是获取运行时传递的消息Id的任何值。在何处声明ClassID?还可以发布DECLARE_RS232_NEWMSG宏(或至少是其中的一部分)您希望ClassID获取DECLARE_RS232_NEWMSG的返回值,对吗?请尝试#define ClassID DECLARE_RS232_NEWMSG()…我不确定..而且我不知道DECLARE_RS232_NEWMSG函数是否需要ClassID参数