簡體   English   中英

如何避免從`Xlib.h`到`Status`的全局定義的C宏?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM