我想知道使用简单整数和memsize的正确方法是什么?准确地说, 我有一个最初为32位架构编写的C代码。现在它必须遇到这两种体系结构,因此有明显的理由在64位体系结构中运行时获得以下警告
warning: cast to pointer from integer of different size
我正在尝试使用memsize intptr_t
和uintptr_t
删除这些警告。但如果我们使用混合简单整数和memsizes,我怀疑它是否正常工作。我想知道使用它的正确方法。以下是代码示例。
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);
两种方式都有效。但我不确定哪种方法合法且最好? 寻找一些建议。
由于
答案 0 :(得分:2)
最大的问题是,如果你真的需要混合指针和整数。 (在这种情况下,处理类似lisp的通用数据结构的情况很少。)如果没有,则应使用正确的类型,并且仅使用该类型。
但是,如果是这种情况,你真的需要使用相同的功能处理它们吗?例如,您可以list_Cons_pointer
和list_Cons_int
分别接受真实指针和匹配preindexed
的整数类型。
是否应该更改preindexed
的类型实际上取决于它在程序中的含义。
除此之外,intptr_t
保证足够大以容纳指针,但它可能更大。这意味着在所有可能的环境中都没有办法摆脱所有警告(想想48位指针......)
答案 1 :(得分:0)
preindex真的是指针吗?如果是这样,那么你的问题是使用int作为指针类型。使用int *。
另外,我建议使用int *而不是intptr_t。 intptr_t是一个宽度足以容纳指针的整数,但在语义上它仍然是一个整数。
在32位机器上,int是32位宽,int *也是32位宽。在64位机器上int仍然是32位宽,但int *是64位宽。