2015-09-24 1 views
0

Я пытаюсь реализовать общий стек в C с помощью большого макроса (не лучшим образом, но здесь дело не в этом). Этот макрос содержит функции деклараций, структуры и функции вызовов, с TYPE типа, который будет заменен на то, что нужно:Общий многострочный макрос с параметрами

#define STACK(TYPE)               \ 
(                   \ 
    struct stack                \ 
    {                  \ 
     size_t   size;            \ 
     struct container *top;            \ 
    };                  \ 
                      \ 
    struct container               \ 
    {                  \ 
     TYPE    data;            \ 
     struct container *next;            \ 
    };                  \ 
                      \ 
    struct stack *stack_init(void)           \ 
    {                  \ 
     struct stack *s = malloc(sizeof (struct stack));      \ 
     if (!s)                \ 
      return NULL;              \ 
     return s;               \ 
    }                  \ 
    ... ... 
) 

Этот заголовочный файл будет называться в любом .c файле с этой линией

#include "utils_stack.h" 
STACK(int) 

Вещь, пробовав все возможные формы синтаксиса, gcc попросил меня попробовать, я не могу найти способ заставить его работать. Я попытался со скобками, скобками, обоими, ... Код просто не работает. Здесь ошибка я получаю с выше синтаксиса, например: error: expected identifier or ‘(’ before ‘struct’

При попытке запустить GCC с флагом -E, я ясно вижу, что TYPE заменяется int.

Итак, вот мой вопрос, Как мне написать свой макрос, чтобы ... использовать его?

Спасибо заранее

+3

Просто избавитесь от круглых скобок (то есть второй и последней строки), и он должен скомпилироваться без каких-либо ошибок. –

ответ

1

Как уже отмечался в комментариях, это должно работать, просто удалите скобки:

#include <stdio.h> 
#include <malloc.h> 

#define STACK(TYPE)               \ 
    struct stack                \ 
    {                  \ 
     size_t   size;            \ 
     struct container *top;            \ 
    };                  \ 
                      \ 
    struct container               \ 
    {                  \ 
     TYPE    data;            \ 
     struct container *next;            \ 
    };                  \ 
                      \ 
    struct stack *stack_init(void)           \ 
    {                  \ 
     struct stack *s = malloc(sizeof (struct stack));      \ 
     if (!s)                \ 
      return NULL;              \ 
     return s;               \ 
    }                  \ 


STACK(int) 

int main() 
{ 
    struct stack *s; 
    s = stack_init(); 
    // ... 
} 

Используйте круглые скобки, если определить функции, как макросы, например:

#define maxint(a,b) \ 
    ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) 

Для получения более подробной информации см. gcc statement expresions.

+0

Я попробовал это, и он возвращает меня 'error: ожидаемый идентификатор или '(' before '{' token' (я его положил, вот почему я не понимаю) – P1kachu

+0

@ P1kachu Извините, мой плохой, пожалуйста см. редактирование. – sergej

Смежные вопросы