【问题标题】:Cross platform version of __PTRDIFF_TYPE____PTRDIFF_TYPE__ 的跨平台版本
【发布时间】:2016-03-28 05:48:52
【问题描述】:

预处理时是否有跨平台的方法来判断ptrdiff_t是否与longlong long相同?

我知道__PTRDIFF_TYPE__ 应该使用 gcc/g++ 给出类型,但它似乎没有在 Windows 的 VC/VC++ 中定义。有比以下更好的方法吗?

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

如果在预处理期间不可能,是否有编译时方法?我正在寻找一个非 C++11 的解决方案,但如果你有一个非常好的现代解决方案,请随时分享!

【问题讨论】:

  • 为什么需要知道?在标准库中定义ptrdiff_t 的意义在于您不必关心它是如何定义的。
  • 我正在尝试将 Python2 PyIntObject 转换为 ptrdiff_t,并且有不同的方法可以将其转换为 longlong long。我想从技术上讲,long long 方法总是可行的,但它并不那么干净,因为 Python 在内部将值存储在 long 中。
  • 请将该信息添加到问题中。你有一个XY problem。您需要将PyIntObject 转换为ptrdiff_t,但不是询问这个问题,而是询问如何确定ptrdiff_t 使用哪种类型。 (顺便说一句,ptrdiff_t 不一定是 longlong long,但在任何支持 Python 的平台上都可能是其中一个。)

标签: c++ c visual-c++ c-preprocessor ptrdiff-t


【解决方案1】:

编译时方法非常明显:

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

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

TMK,没有可移植的定义。然而,这只是一个小障碍。只需一点点脚本,任何这种性质的编译时测试都可以使用autoconfautomake 等标准工具轻松转换为基本上基于预处理器的测试。这些是数以千计的免费软件库和工具使用的标准工具,专门用于此目的。

【讨论】:

  • 在某些实现中,longlong long 的大小相同(但它们仍然是不同的类型)。
  • 这将值得另一个 sizeof(long) == sizeof(long long) 测试,仅此而已。
  • 如果sizeof(long) == sizeof(long long),你无法轻易分辨出它们中的哪一个用于定义size_t。这是否是关于 OP 正在做什么的问题的朋友(最新评论更清楚了)。
猜你喜欢
  • 2018-04-17
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多