LINUX.ORG.RU

Помогите составить макрос в С

 


0

0

Собственно все просто:

#define EXIT(); {free(rec_listing); json_decref(json_root); return NULL;}
void *func(void)
{
    if (0)
        EXIT();
    return 0x100500;
}
Кто знает, тот понимает, что тут всегда будет выполнен:
return NULL;
Как решить?

★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Ответ на: комментарий от emulek

Если условие ложно, чтобы не выходило из функции.

FIL ★★★★
() автор топика
Ответ на: комментарий от ziemin

Дык, пример просто...

FIL ★★★★
() автор топика
Ответ на: комментарий от crowbar

Причем косяк не в том, что do..while не использован, а в ";" после имени макроса в define. Но do...while тоже нужен иначе на if..else будет ошибка компиляции.

crowbar
()

Убери первую ; в определении EXIT():

#define EXIT() {free(rec_listing); json_decref(json_root); return NULL;}
rupert ★★★★★
()

Всем спасибо - с dowhile работает.

FIL ★★★★
() автор топика
Ответ на: комментарий от crowbar

Лор позновательный

Не мог бы ты продемонстрировать пример, где будет такая ошибка компиляции?

И ещё вопрос: что именно нужно оборачивать в do {} while(0)?

Спасибо.

EXL ★★★★★
()
Ответ на: Лор позновательный от EXL

И ещё вопрос: что именно нужно оборачивать в do {} while(0)?

это костыль. После макроса ставят «;», а в макросе она не нужна.

Не мог бы ты продемонстрировать пример, где будет такая ошибка компиляции?

#define MACRO { test(); }

void test(){}

int main(int argc, const char* argv[])
{
	if(argc)
		MACRO;
	else
		;
	return 0;
}
macro.c: В функции «main»:
macro.c:9:2: ошибка: «else» without a previous «if»
  else
  ^
$ gcc -E
void test(){}

int main(int argc, const char* argv[])
{
 if(argc)
  { test(); };
 else
  ;
 return 0;
}

код с do/while раскрылся в

void test(){}

int main(int argc, const char* argv[])
{
 if(argc)
  do{ test(); }while(0);
 else
  ;
 return 0;
}

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.