[英]How to avoid a globally defined C macro of `Status` from `Xlib.h`?
我正在使用一些包含/usr/include/X11/Xlib.h
opengl庫,在此頭文件的第83行, Status
定義為宏:
#define Status int
我也在使用Google的protobuf,它的代碼如下:
LogMessage& operator<<(const ::google::protobuf::util::Status& status);
在這種情況下,我應該同時使用它們嗎?
解決此問題的C ++機制是使用名稱空間。
甚至在任何情況下,您都必須擺脫宏,並在包括臭名昭著的X代碼之后再放這個宏。
#if defined (Status)
# undef Status
typedef int Status ;
#endif
那可能會自己解決問題。
這里的問題是項目的依賴管理。
如果您的項目組織得很好,那么protobuf生成的代碼將僅在應用程序的網絡層中可見,而代碼處理UI不會看到該部分代碼。
反之亦然,應該隔離UI,以使X11標頭不應泄漏到業務邏輯或網絡層中。 這是鮑伯叔叔的精彩演講,解釋了該問題以及如何處理。
由於很難修復已經編寫的項目中的依賴項。 您可能被迫在替代答案中使用undefine
技巧。 無論如何,首先應該檢查將標頭包含在翻譯單元中時是否可以將標頭彼此隔離。
改善這種隔離的一種方法是清理頭文件。 盡可能多地轉發聲明,並包括其他標頭的最小標頭數。 如果做得好,protobuf標頭和X11標頭在同一源文件中將無法滿足,這是更好的解決方案。 有一個很好的工具可以實現這一目標。 包括您使用的內容 。 這很有可能解決您的問題,另一個好處是可以縮短項目的構建時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.