簡體   English   中英

如果在 C++ 中定義了類型,是否可以在預處理器時檢測到?

[英]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檢查最小版本。

其他編譯器通常有自己的特定定義,或者只是根據編譯器類型提供您自己的定義。

嗯,看到了:

  • 視覺C++沒有定義ulong
  • GCC 定義它,因為 GCC 6
  • 最后適用於 Clang 到
  • Clang 在 Clang 6 中將__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.

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