Правильный способ использования простого целого числа и memsizes - PullRequest
0 голосов
/ 22 апреля 2011

Я хотел бы знать, как правильно использовать простые целые и средние размеры? Если быть точным, у меня есть код на C, изначально написанный для 32-битной архитектуры.Теперь он должен работать в обеих архитектурах, поэтому есть очевидная причина получить следующее предупреждение при работе в 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);

Оба способа работают.Но я не уверен, какой метод является законным и лучшим?Нужны некоторые предложения.

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Большой вопрос в том, нужно ли вам смешивать указатели и целые числа. (Несколько случаев, когда это имеет место, при обработке обобщенных структур данных типа lisp.) Если нет, вы должны использовать правильный тип и только этот тип.

Однако, если это так, вам действительно нужно обрабатывать их, используя ту же функцию? Например, вы можете иметь list_Cons_pointer и list_Cons_int, которые принимают действительный указатель и целочисленный тип, соответствующий preindexed, соответственно.

Нужно ли вам менять тип preindexed, действительно зависит от того, что он представляет в программе.

Помимо этого, intptr_t гарантированно будет достаточно большим, чтобы содержать указатель, но он может быть больше. Это означает, что действительно невозможно избавиться от всех предупреждений во всех возможных средах (например, 48-битные указатели ...)

0 голосов
/ 22 апреля 2011

Действительно ли preindex является указателем?Если это так, то ваша проблема использует int в качестве типа указателя.Используйте int *.

Также я бы рекомендовал использовать int * вместо intptr_t.intptr_t - это целое число, достаточно широкое для хранения указателя, но семантически оно все еще является целым числом.

На 32-битной машине int имеет ширину 32 бита, а int * также имеет ширину 32 бита.На 64-битной машине int все еще имеет ширину 32 бита, но int * имеет ширину 64 бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...