Генерация меток в макропереработке в C - PullRequest
2 голосов
/ 23 июля 2010

Как написать макрос, который вызывает goto END_ label?

Например:

#define MY_MACRO() \
//How to define goto END_##function_name label??

my_function()
{
    MY_MACRO();

END_my_function:
   return;
}

MY_MACRO следует просто заменить на строку

goto END_my_function;

Ответы [ 3 ]

3 голосов
/ 23 июля 2010

Не думаю, что это можно сделать.Даже если некоторые компиляторы определяют __FUNCTION__ или __func__, они не раскрываются в макросах.

Однако учтите, что вам не нужна отдельная метка для каждой функции: вы можете использовать END для всехфункции и просто написать goto END.

2 голосов
/ 23 июля 2010

Препроцессор не знает, в какой функции он находится. Но вы можете подойти ближе - вам придется передать имя функции этому макросу

#include <stdio.h>

#define GOTO_END(f) goto f ## _end

void foo(void)
{
   printf("At the beginning.\n");

   GOTO_END(foo);

   printf("You shouldn't see this.\n");

  foo_end:
   printf("At the end.\n");
   return;
}

int main()
{
   foo();
}
1 голос
/ 23 июля 2010

Использовать объединение токенов .

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