Understanding #ifdef in .h files

Pranay Srivastava pranjas at gmail.com
Fri Jun 20 09:14:35 EDT 2014


On Fri, Jun 20, 2014 at 6:29 PM, Harold André <harold.andre at gmx.fr> wrote:
> Le Fri, 20 Jun 2014 16:36:58 +0530,
> Pranay Srivastava <pranjas at gmail.com> a écrit :
>
>
>> You say here you will define the function else where if TEST_FUNCTION
>> is defined
>>
>> >     #ifdef TEST_FUNCTION
>> >     void test(int *value);
>> >     #else
>> >     static inline void test(int *value) { }
>> >     #endif
>> >
>> > test_ifdef.c:
>> >
>> >     #include "test_ifdef.h"
>> >
>> But here you do on and define it any way. You must stick to the rule
>> you created earlier. If you are defining it here then this must also
>> be under the test of ifdef TEST_FUNCTION
>> >     void test(int *value)
>> >     {
>> >         *value += 1;
>> >     }
>> >
>
> Thank you Pranay for your answer. I understand this now.
>
> But when i look at the kernel code, i don't see ifdef test around the
> definition of the function. For example, i look for the function
> "hiddev_hid_event":
>
> In include/linux/hiddev.h:
> #ifdef CONFIG_USB_HIDDEV
> ...
> void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
>                         struct hid_usage *usage, __s32 value);
> ...
> #else
> ...
> static inline void hiddev_hid_event(struct hid_device *hid, struct
> hid_field *field, struct hid_usage *usage, __s32 value) { }
> ...
> #endif
>
> In drivers/hid/usbhid/hiddev.c:
> /*
>  * This is where hid.c calls into hiddev to pass an event that occurred
> over

That's right but the magic doesn't happen here :-)

if you see usbhid/Makefile you'll understand what I mean :-). If not ,
please do ask.


>  * the interrupt pipe
>  */
> void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
>                       struct hid_usage *usage, __s32 value)
> {
>         unsigned type = field->report_type;
>         struct hiddev_usage_ref uref;
>
>         uref.report_type =
>           (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT :
>           ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT :
>            ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE :
>         0)); uref.report_id = field->report->id;
>         uref.field_index = field->index;
>         uref.usage_index = (usage - field->usage);
>         uref.usage_code = usage->hid;
>         uref.value = value;
>
>         hiddev_send_event(hid, &uref);
> }
> EXPORT_SYMBOL_GPL(hiddev_hid_event);
>
> And in drivers/hid/hid-core.c:
> ...
>
>         if (hid->claimed & HID_CLAIMED_INPUT)
>                 hidinput_hid_event(hid, field, usage, value);
>         if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt &&
>         hid->hiddev_hid_event)
>                 hid->hiddev_hid_event(hid, field, usage, value);
> ...
>
> If i'm right. The function "hiddev_hid_event" is always defined in
> "hiddev.c" whatever "CONFIG_USB_HIDDEV" is defined or not ?
> How is it possible ?



-- 
        ---P.K.S



More information about the Kernelnewbies mailing list