2015-12-22 89 views
0

在預處理過程中,是否有跨平臺的方式來確定ptrdiff_t是否與longlong long相同?跨平臺版本的__PTRDIFF_TYPE__

我知道__PTRDIFF_TYPE__應該給gcc/g ++類型,但它似乎沒有在VC/VC++ for Windows中定義。有沒有比以下更好的方法?

#ifndef __PTRDIFF_TYPE__ 
# if _WIN64 
# define __PTRDIFF_TYPE__ long long 
# else 
# define __PTRDIFF_TYPE__ long 
# endif 
#endif 

如果在預處理過程中不可行,是否有編譯時間的方法?我正在尋找非C++ 11解決方案,但如果您有一個非常好的現代解決方案,請隨時分享!

+0

爲什麼你需要知道?在標準庫中定義'ptrdiff_t'的一點是,你不必關心它是如何定義的。 –

+0

我試圖將一個Python2'PyIntObject'轉換爲'ptrdiff_t',並且有不同的方法將它轉換爲'long'和'long long'。我想從技術上講,漫長的方法總是會起作用,但是它並不是那麼幹淨,因爲Python在內部長期存儲這個值。 – Alec

+1

請將該信息添加到問題中。您有[XY問題](http://meta.stackexchange.com/q/66377/167210)。您需要將一個'PyIntObject'轉換爲'ptrdiff_t',但不是問這個問題,而是問如何確定'ptrdiff_t'使用哪種類型。 (順便說一句,'ptrdiff_t'不一定是'long'或'long long',但它可能是任何支持Python的平臺上的其中一個。) –

回答

2

編譯時的做法是非常明顯的:

if (sizeof(ptrdiff_t) == sizeof(long)) 

if (sizeof(ptrdiff_t) == sizeof(long long)) 

TMK,也有對此沒有便攜式定義。但是,這只是一個小小的障礙。只需一點腳本,任何編譯時測試都可以使用標準工具(例如autoconfautomake)輕鬆轉換爲基本上基於預處理器的測試。爲了這個精確的目的,這些是成千上萬的免費軟件庫和工具所使用的標準工具。

+0

在某些實現中,'long'和'long long'是相同的大小(但它們仍然是不同的類型)。 –

+0

這將有利於另一個sizeof(long)== sizeof(long long)測試,僅此而已。 –

+0

如果'sizeof(long)== sizeof(long long)',你不能很容易地判斷它們中哪些被用來定義'size_t'。無論OP在做什麼都是朋友的問題(最新評論有點清楚)。 –