ограничение на использование # define'd функций / встроенных функций в файлах сборки - PullRequest
0 голосов
/ 31 января 2010

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

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

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

В то время как в заголовочном файле h 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. используется для всех других файлов, включая файл h.

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

1 Ответ

0 голосов
/ 31 января 2010

В заголовочном файле 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 до того, как произойдет компиляция. Некоторым это может показаться неприятным, но это одна из возможностей препроцессора, и она весьма полезна (при соблюдении надлежащих мер предосторожности).

...