оператор возврата в макросе (#define) в C - PullRequest
2 голосов
/ 13 сентября 2011

Можно ли написать макрос для следующей функции:

char *sent_same_text(char *txt)
{
    return txt;
}

Я пытался

#define sent_same_text(txt) return(txt);

но получаю ошибку компиляции.

Ответы [ 3 ]

6 голосов
/ 13 сентября 2011

Просто сделайте:

#define sent_same_text(txt) (txt)

Вам нужно только return для функций. Макрос отличается тем, что это вставка буквальной строки в ваш код. Убедитесь, что у вас есть круглые скобки вокруг txt.

3 голосов
/ 13 сентября 2011

Оператор возврата в макросе вернется из функции, которая «вызывает» макрос. Функциональные макросы являются сокращением для генерации одного и того же кода несколько раз. Они не являются фактическими вызовами функций.

Вот пример того, почему вы можете поместить возврат в макрос:

/* do-while() loop is a trick to let you define multi-statement macros and */
/* call them like functions. Note the lack of trailing ';' */
#define ERROR(msg) do{ fprintf(stderr, (msg)); errorCount++; return -1; }while(0)

/* foo() returns 0 or success or -1 on failure */
int foo(int x, int y){
   if ( x < 10 )
   {
      ERROR("x is out of range\n");
   }
   if ( y < 20 )
   {
      ERROR("y is out of range\n");
   }
   doSomething(x,y);
   return 0;
}

Вызов foo с x = 25 приведет к возврату -1, и будет напечатано сообщение «x вне диапазона».

Не говорю, что это хороший стиль, но, надеюсь, иллюстрирует, как возврат в макросе отличается от возврата в функции.

1 голос
/ 13 сентября 2011
#define sent_same_text(text) (text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...