使用简单整数和memsizes的正确方法

时间:2011-04-22 17:19:35

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

我想知道使用简单整数和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);

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

由于

2 个答案:

答案 0 :(得分:2)

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

但是,如果是这种情况,你真的需要使用相同的功能处理它们吗?例如,您可以list_Cons_pointerlist_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位宽。