2010-01-31 4 views
0

Есть ли ограничение на использование функций # define'd/встроенных функций внутри файлов сборки.ограничение на использование функций # define'd/встроенных функций внутри файлов сборки

Я назвал ядро ​​bsd, в котором определены две различные реализации. Одним из них является макро и другой является нормальной функцией (оба для той же функции)

В с файла splx определяется asfunction, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.c

В то время как в ч заголовка файла splx определяется как макро, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.h

Мое понимание - определение файла c используется в файлах сборки, тогда как определение макроса используется во всех других функциях, в которые включен заголовочный файл.

Я думаю, что я не понимаю, почему сборка вступает в картину здесь. В основном есть два определения: один в файле c и другой в h файле для splx. Когда я просто комментирую определение splx в C fle, я получаю некоторые ошибки в компиляции файлов Assembly. (Cpu.S) То, почему я думал, что определение функции используется (как в c-файле) при компиляции файла сборки, тогда как определение макроса используемый для всех других файлов, включает h-файл.

Теперь мой вопрос: почему файл сборки тоже не может использовать определение макроса, включая заголовочный файл?

+0

Вы нашли ответ или ищете дополнительную помощь? –

+0

, котор нужно больше помочь – kumar

ответ

0

В файле заголовка, splx определяется как

void splx(int) 
void _setsoftintr(int); 

#if !defined(EVBARM_SPL_NOINLINE) 
#define splx(new) omap_splx(new) 
#define _spllower(ipl) omap_spllower(ipl) 
#define _setsoftintr(si) omap_setsoftintr(si) 
#endif /* !EVBARM_SPL_NOINTR */ 

Я не уверен, почему вы ссылаетесь на сборочные файлы, когда этот язык явно C, но я не вижу ничего плохого в этих декларациях - splx является функцией, но если определен EVBARM_SPL_NOINLINE, то макрос используется для переназначения всех применений splx в splx_omap. Это допустимое использование препроцессора и не переопределяет splx - скорее, используя некоторые обманки для изменения кода для использования splx_omap.

Это работает, потому что препроцессор работает перед компилятором, поэтому любое появление splx будет заменено splx_omap перед компиляцией. Некоторые люди считают это тревожным, но это одна из возможностей препроцессора и весьма полезна (при соблюдении надлежащих мер предосторожности).

+0

hi Sam, Thanks! Я думаю, что я не понимаю, почему сборка вступает в картину здесь. В основном есть два определения: одно в файле c и другое здесь для splx. Когда я просто комментирую определение splx в C fle, я получаю некоторые ошибки в компиляции файлов Assembly. (Cpu.S) Точ, почему я думал, что определение функции используется (как в c-файле) при компиляции файла сборки, тогда как определение макроса используется для всех других файлов, включая h-файл. Теперь мой вопрос заключается в том, почему файл сборки тоже не может использовать определение макроса, включая заголовочный файл. – kumar

+0

Определение макроса используется только для того, чтобы заставить всех вызывающих лиц splx использовать splx_omap вместо этого, если определен EVBARM_SPL_NOINLINE. Компиляция cpu.S, вероятно, не определяет EVBARM_SPL_NOINLINE, поэтому вы получаете ошибки, когда splx закомментирован в файле C. Если вы хотите, чтобы cpu.S использовал splx_omap, тогда определите EVBARM_SPL_NOINLINE или обновите всех вызывающих пользователей splx, чтобы использовать splx_omap, отредактировав все файлы. Это помогает? –

Смежные вопросы