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

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

  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);

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

谢谢

最佳答案

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

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

是否应该更改预索引的类型实际上取决于它在程序中代表的内容。

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

关于c - 使用简单整数和内存大小的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758074/

相关文章:

c++ - 验证数学方程 c++

go - 我如何在golang中将字符串转换为整数

c - 确定打开的文件是否已在 C 中被修改

c# - 在 C# 应用程序中构建静态库

c - 如何在 C 程序开始时开始计时

c++ - C++ 中的函数指针转换

c++ - 如何在没有 typedef 的情况下进行函数指针转换?

c - 使用scanf在C中读取多个字符数组

c++ - 有什么方法可以禁用特定代码行的编译器优化?

java - 使用命令行通过Java File编译文件