Objective c 宏->;目标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 错误:“此
#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参数