使用简单整数和内存大小的正确方法

问题描述 投票:0回答:2

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

 warning: cast to pointer from integer of different size

我正在尝试使用 memsize、

intptr_t
uintptr_t
删除这些警告。但我怀疑如果我们使用混合的简单整数和内存大小它是否可以正常工作。我想知道正确的使用方法。以下是代码示例。

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

这里

compllits
是一个链表,定义为
pointer
list_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);

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

谢谢

c casting compiler-warnings 32bit-64bit
2个回答
2
投票

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

但是,如果是这种情况,您真的需要使用相同的函数来处理它们吗?例如,您可以让

list_Cons_pointer
list_Cons_int
分别接受真实指针和与
preindexed
匹配的整数类型。

是否应该更改

preindexed
的类型实际上取决于它在程序中代表的内容。

除此之外,

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.