2015-09-24 77 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’

試圖運行與-E標誌GCC,我清楚地看到,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

我試過了,並返回我 '錯誤:預期標識符或「(」前「{」 token' (我沒把它,這就是爲什麼我不明白) – P1kachu

+0

@ P1kachu對不起,是我不好,請請參閱編輯。 – sergej