Макросы-> Цель C - PullRequest
       10

Макросы-> Цель C

0 голосов
/ 05 мая 2011

Я новичок в цели 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 здесь не объявлен»

почему эта ошибка.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011
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;
}

Надеюсь, это поможет ..

0 голосов
/ 05 мая 2011

Ну, потому что ClassID, вероятно, там не объявлен. Определение макроса продолжается только до конца строки (если только конец строки не экранирован с помощью \), поэтому ваша вторая строка является , а не частью объявления макроса, и, следовательно, формальные аргументы макроса не определены там. Другими словами, вы только что объявили макрос DECLARE_RS232_NEWMSG, который расширяется до нуля, а затем попытались объявить символический константный (глобальный) идентификатор, используя неопределенное значение ClassID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...