2013-02-26 86 views
3

我想編寫一個宏,以協助在C.面向對象的編程正如我存儲在一個恆定的結構類信息,我需要創建一個宏,執行以下操作:C代碼宏得到的typeof參數

  • 取對象的類型(typeof運算的derefenced指針)
  • 追加_info得到的名稱進行必要的CLASSINFO結構
  • 採取這一符號的地址,因此它可以被傳遞給函數
  • 調用destroyObject功能與指針類結構和對象本身

一個例子:

queue_t* p = NULL; 
delete(p); 

delete應擴展爲:

destroyObject(&(queue_t_info), p); 

我試着用這個宏,但我不能去上班:

#define delete(X) (destroyObject(&(typeof(*X)##_info), X)) 

我有麻煩機智h typeof部件才能正常工作。

+0

你似乎認爲類型有名。 – melpomene 2013-02-26 10:40:30

+0

因此,當傳遞一個整數的引用時,讓prerossrossor吐出'int'完全不可能? – charliehorse55 2013-02-26 10:41:25

+0

@melpomene你爲什麼認爲他們不? – 2013-02-26 11:29:23

回答

5

typeof不是宏,它是語言結構,它由編譯器擴展,而不是預處理器。由於預處理在編譯之前進行,因此宏不能訪問typeof結果。

您的delete(p)擴展爲:(destroyObject(&(typeof(*p)_info), p))。 (你可以看到-E gcc標誌)

+0

非常感謝,我想通了這個。 – charliehorse55 2013-02-26 11:41:06

2

我意識到我試圖做的事情是不可能的 - C預處理器不會解析和符號化代碼,因此它不知道哪種類型的變量。

爲了解決這個問題,我需要將類型傳遞給delete函數。這並不理想,因爲它引入了由於類型不匹配而頻繁出現的錯誤。如果一個程序員傳遞一個指向對象A的指針,但在delete函數中指定了對象B,則會調用錯誤的析構函數。爲了解決這個問題,我給宏添加了一個類型檢查,以便爲任何不匹配的類型生成編譯器警告。

#define typecheck(type,x) \ 
({ type __dummy; \ 
typeof(x) __dummy2; \ 
(void)(&__dummy == &__dummy2); \ 
}) 

#define delete(P, X) (destroyObject(&(X##_info), P), typecheck(X, *P)) 
#define new(X, ...) (createObject(&(X##_info), ##__VA_ARGS__)) 

宏的正常使用:

queue_t* p = new(queue_t); 
delete(p, queue_t); 

但是使用了錯誤類型:

queue_t* p = new(queue_t); 
delete(p, int); 

導致編譯器警告:

Comparison of distinct pointer types ('int *' and 'typeof (*p) *' (aka 'queue_t *'))