#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