2012-07-24 62 views
4

我想用具有相同名稱的正確typedef替換宏。我有用相同名稱的typedef替換預處理器宏

#define FooType char* 
在第三方庫

,這打破了我的一些代碼(更準確地說:一些代碼,我被迫使用和我不能改變自己)。我想用一個相同名稱的typedef替換它,然後用宏名稱#undef。我想類似的東西:

#define TMP_MACRO FooType 
#undef FooType 
typedef TMP_MACRO FooType; 
#undef TMP_MACRO 

但預處理器擴展這:

typedef FooType FooType; 

(至少那是什麼g++ -E告訴我的)。所以宏TMP_MACRO不立即擴大。由於'FooType'不在那裏,它不能編譯。

如何用適當的類型替換宏FooType,然後取消宏定義?或者這是不可能的?

+0

從向第三方提交錯誤報告開始,讓罪人受到懲罰。 – pmr 2012-07-24 15:23:01

+0

也想到了這一點 - 這是一個令人印象深刻的例子,爲什麼宏是邪惡的:D – Sh4pe 2012-07-24 15:42:33

回答

9

A typedef聲明通常在一行上,但行號對編譯器沒有任何意義。

typedef FooType 
#undef FooType 
FooType; 
+0

太棒了!這讓我很難笑!謝謝! :) – Sh4pe 2012-07-24 15:45:53

+0

是的,我也嘗試了一些不同的東西,然後當我想到這件事時很開心。 – aschepler 2012-07-24 15:47:51

+0

+1 _Excellent_! – 2012-07-24 15:48:39

0

爲什麼不乾脆

#undef FooType 
typedef char* FooType 

你得到的輸出是正確的,因爲你指示預處理器,以取代TMP_MACROFooType(你undef FooType事後算個什麼問候到這樣一個事實)。

+0

然後,我將不得不保持這一行 - 每次,第三方庫將其宏「FooType」更改爲其他東西,我不得不改變我的線也是。我想從第三方庫中提取信息,而不是公開它。 – Sh4pe 2012-07-24 15:17:00

+0

@ Sh4pe我懷疑這是可能的(可能是錯誤的)。急切地等待答案... – 2012-07-24 15:18:10