указатель на __u32 в заголовочном файле

#linux #header #linux-kernel

#linux #заголовок #linux-ядро

Вопрос:

Мне нужно передать указатель следующим образом

 extern int Si4709_dev_chan_get(__u32 *);
  

но gcc жалуется на отсутствие скобок.

 Si4709_dev.h:130: error: expected ‘)’ before ‘*’ token
  

есть идеи о том, что я могу сделать?

-Earlence

Ответ №1:

Возможно, вам нужно включить заголовок, который содержит typedef для __u32, обычно это <asm/types.h> или <sys/types.h> .

В любом случае они не должны быть переносимыми, вы должны полагаться на что-то, что с большей вероятностью будет переносимым, например uint32_t , которое должно быть стандартным для реализаций, соответствующих C99 (и это должно быть в stdint.h .

Комментарии:

1. Согласен, за исключением, возможно, части о переносимости, поскольку похоже, что это может быть код драйвера устройства ядра Linux, где это, по-видимому, широко используемый тип, и в этом случае необходимые изменения включают что-то вроде <linux /types.h>

2. Это соглашение ядра Linux для типа, предназначенного для совместного использования между ядром и пользовательским пространством, поэтому он не должен быть переносимым.

3. Но да, они распознаются через <asm/types.h>

Ответ №2:

Это старый, вероятно, мертвый вопрос, но, похоже, есть некоторая путаница в том, что такое __u32 на самом деле, но, по крайней мере, в 3.16.1, на которую я сейчас смотрю, __u32 определен в ./include/uapi/asm-generic/int-ll64.h таким образом,:

 typedef unsigned int __u32;
  

Итак, это просто целое число без знака.

в противном случае ваш синтаксис неверен, поскольку это определение функции, вам нужно как-то назвать указатель, чтобы ссылаться на него внутри функции:

 extern int Si4709_dev_chan_get(__u32 *x);
  

В противном случае смотрите это подробнее.

http://en.wikipedia.org/wiki/Pointer_(computer_programming)#Pass-by-address_using_pointers