Re: Understanding #ifdef in .h files
Hi Harold On 6/20/14, Harold André harold.an...@gmx.fr wrote: Hi, I try to understand how #ifdef in .h files works. I read Greg Kroah-Hartman's Coding style paper http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/mgp00031.html And as he says, i try to do a simple example but it does not work. I try with a small piece of C outside the kernel. I have 3 files. test_ifdef.h: 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; } main.c: #include stdio.h #include test_ifdef.h int main(int argc, char *argv[]) { int i = 3; printf(i = %d\n, i); test(i); printf(i = %d\n, i); return 0; } And when i compile: $ gcc -Wall -g main.c test_ifdef.c -o test_ifdef -DTEST_FUNCTION $ ./test_ifdef i = 3 i = 4 $ gcc -Wall -g main.c test_ifdef.c -o test_ifdef test_ifdef.c:14:6: error: redefinition of ‘test’ void test(int *value) ^ In file included from test_ifdef.c:12:0: test_ifdef.h:17:20: note: previous definition of ‘test’ was here static inline void test(int *value) { } ^ $ I understand why it does not compile. But: - How it can work in the kernel code ? - Is-it possible to do this in code outside the kernel ? Thank you. Harold ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies -- ---P.K.S ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: Understanding #ifdef in .h files
On Fri, Jun 20, 2014 at 6:29 PM, Harold André harold.an...@gmx.fr wrote: Le Fri, 20 Jun 2014 16:36:58 +0530, Pranay Srivastava pran...@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 ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: Understanding #ifdef in .h files
Le Fri, 20 Jun 2014 16:36:58 +0530, Pranay Srivastava pran...@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 * 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 ? ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: Understanding #ifdef in .h files
Le Fri, 20 Jun 2014 18:44:35 +0530, Pranay Srivastava pran...@gmail.com a écrit : On Fri, Jun 20, 2014 at 6:29 PM, Harold André harold.an...@gmx.fr wrote: Le Fri, 20 Jun 2014 16:36:58 +0530, Pranay Srivastava pran...@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. Ah yes !! Ok, i understand !! ;-) Thank Pranay for sharing your knowledge ! ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies