[英]Is possible to detect at preprocessor-time if a type is defined in C++?
看起來在 GCC 歷史的某個時刻,類型ulong
被定義為unsigned long long
,但這會在編譯器之間造成一些沖突,因為我將項目傳遞給其他編譯器沒有定義ulong
(如 Visual C++)。 這是我想做的一個例子:
#ifndef ulong
typedef unsigned long long ulong;
#endif
但這永遠不會奏效,因為這不是#ifdef
的工作方式。 你會怎么做? 如何以最短的方式做到這一點?
對於你的問題,你可以寫typedef unsigned long ulong;
無需任何預處理,因為您可以重復 typedef(在任何 C++ 中,但如果您使用 C,則只能從 C11 開始)。
我建議不要在你的代碼中使用ulong
,因為它只是為了與某些系統兼容而提供的,並且不是標准的 C 也不是 C++。 unsigned long
更容易理解,寫起來也不難
作為參考,它在<sys/types.h>
中定義(作為unsigned long
而不是unsigned long long
,但它們可以是相同的大小)
不,預處理器無法確定是否已定義類型(或除預處理器宏之外的任何其他內容)。 畢竟,預處理器會在任何事情發生之前運行。
如果您希望您的代碼可跨計算機移植,請不要使用不屬於 C++ 標准的特定於編譯器的工具。
不是檢查類型,而是檢查編譯器。
#ifdef _MSC_VER
typedef unsigned long long ulong;
#endif
或#if _MSC_VER >= 1910
檢查最小版本。
其他編譯器通常有自己的特定定義,或者只是根據編譯器類型提供您自己的定義。
嗯,看到了:
ulong
__GNUC__
定義為 4最好的方法是添加此代碼:
#if _MSC_VER || (__GNUC__ && __GNUC__ < 6 && !__clang__) || (__clang__ && __clang_major__ < 6)
typedef unsigned long long ulong;
#endif
並且在大多數情況下都可以工作,但是,如果有人使用 GCC 4 和 GCC 6+ 庫或類似的東西,這仍然會失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.