【问题标题】:Proper way of using simple integer and memsizes使用简单整数和 memsizes 的正确方法
【发布时间】:2011-08-11 02:43:05
【问题描述】:

我想知道使用简单整数和 memsize 的正确方法是什么?准确地说, 我有一个最初为 32 位架构编写的 C 代码。现在它必须同时运行在这两种架构中,所以在 64 位架构中运行时,有明显的理由得到以下警告

 warning: cast to pointer from integer of different size

我正在尝试使用 memsize、intptr_tuintptr_t 删除这些警告。但我怀疑如果我们使用混合的简单整数和 memsizes 是否能正常工作。我想知道使用它的正确方法。以下是代码示例。

  compllits = list_Cons((POINTER) predindex, compllits);

这里compllits是一个链表,定义为pointerlist_Cons 返回指针。 list_Cons 定义为:

list_Cons(POINTER x, LIST y);

还有, int preindex。我将整数转换为指针。当我在 64 位机器上运行它时,我会收到警告

 : warning: cast to pointer from integer of different size

现在要解决这个警告,我对我使用的两种方法有点困惑,

     Method 1: changing the int preindex into intptr_t preindex.

     Method 2. Keeping  int preindex unchanged but doing following

       compllits = list_Cons((POINTER)(intptr_t)predindex, compllits);

两种方式都有效。但我不确定哪种方法合法且最好? 寻找一些建议。

谢谢

【问题讨论】:

  • 我正在使用 intptr_t 以便根据硬件架构确定整数的大小,并且我不会收到问题中提到的警告。

标签: c compiler-construction casting 32bit-64bit compiler-warnings


【解决方案1】:

最大的问题是您是否真的必须混合使用指针和整数。 (这种情况的少数情况是在处理类似 lisp 的通用数据结构时。)如果不是,您应该使用正确的类型,并且只使用该类型。

但是,如果是这种情况,您真的需要使用相同的函数来处理它们吗?例如,您可以让list_Cons_pointerlist_Cons_int 分别接受与preindexed 匹配的实指针和整数类型。

你是否应该改变preindexed的类型实际上取决于它在程序中代表什么。

除此之外,intptr_t 保证足够大以容纳指针,但它可能更大。这意味着实际上没有办法在所有可能的环境中消除所有警告(想想 48 位指针......)

【讨论】:

  • 是的,确实我必须混合指针和整数。它具有类似于 LISP 的数据结构。链表和二叉树是数据结构,我也必须使用相同的功能。在这种情况下,哪种方式可能是最优化的?
【解决方案2】:

preindex 真的是一个指针吗?如果是这样,那么您的问题是使用 int 作为指针类型。使用 int *。

另外,我建议使用 int * 而不是 intptr_t。 intptr_t 是一个整数,它的宽度足以容纳一个指针,但在语义上它仍然是一个整数。

在 32 位机器上,int 是 32 位宽,而 int * 也是 32 位宽。在 64 位机器上,int 仍然是 32 位宽,但 int * 是 64 位宽。

【讨论】:

  • 没有前索引是整数
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多