C - лучшая практика для приведения void * к int, kernel - PullRequest
0 голосов
/ 12 мая 2018

Я пишу модуль для ядра Linux и хочу сохранить значение int в файле личных данных.

По сути, я делаю: file->private_data = (void*) x где х - какое-то int значение.

Теперь я хочу получить доступ к int как к значению.

Использование int val = (int) file->private_data выдает предупреждение cast from pointer to integer of different size во время компиляции, что является разумным, поскольку это может вызвать проблемы в 64-битных системах.

Я также не могу использовать uintptr_t, так как я работаю в ядре и у меня нет доступа к библиотекам.

Использование double кажется неуместным.

Мой вопрос: какой должна быть лучшая практика для этого?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Не могли бы вы рассказать, как вы оказались в ситуации, когда разумно хранить int?

Обычно это указатель на объект с подсчетом ссылок. В частности, если вы используете это для поиска другого объекта, это поле должно просто указывать на этот объект.

0 голосов
/ 12 мая 2018

В мире gcc (ядро Linux скомпилировано gcc), long (или unsigned long) имеет тот же размер, что и указатель. Вы можете использовать эту функцию при конвертации указателей в целое число и обратно:

// store
file->private_data = (void*)(long) x;
// load
int val = (int) (long) file->private_data;

Примечание : Этот ответ конкретно касается ядра Linux программирования.

Для приложения из пользовательского пространства предложенный подход можно рассматривать как плохую практику или просто неправильно .

...