0

アセンブリ ファイル内で #define された関数/インライン関数を使用することに制限はありますか。

2 つの異なる実装が定義されている bsd カーネルを参照しました。1 つはマクロで、もう 1 つは通常の関数です (どちらも同じ関数です)。

c ファイルでは、splx は関数として定義されています

h ヘッダー ファイルでは、splx はマクロとして定義されていますが、 http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.h

私の理解では、c ファイル定義はアセンブリ ファイルで使用されますが、マクロ定義はヘッダー ファイルが含まれる他のすべての関数で使用されます。

なぜアセンブリがここに登場するのかはっきりしないと思います。基本的に 2 つの定義があります。1 つは c ファイルにあり、もう 1 つは splx の h ファイルにあります。C ファイルで splx 定義をコメントアウトすると、アセンブリ ファイルのコンパイルでエラーが発生します。 h ファイルを含む他のすべてのファイルに使用されます。

ここで私の質問は、ヘッダー ファイルをインクルードしてマクロ定義を使用できないのはなぜですか?

4

1 に答える 1

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 に置き換えられます。これを不快に思う人もいるでしょうが、これはプリプロセッサの機能の 1 つであり、非常に便利です (適切な予防措置が守られている場合)。

于 2010-01-31T10:47:07.483 に答える