Everything

near/far関数(#pragma near/#pragma far) 【V1.05以降】


__near/__farを指定した関数であることをコンパイラに示唆します。

[機能]

-

#pragma nearを指定した関数を,__near指定の関数として呼び出します。

#pragma nearを指定した関数のアドレス参照は必ずnearポインタを返し,関数は再配置属性TEXTのセクションへ配置します。

__nearについてはメモリ配置領域指定(__near/__far)を参照してください。

-

#pragma farを指定した関数を,__far指定の関数として呼び出します。

#pragma farを指定した関数のアドレス参照は必ずfarポインタを返し,関数は再配置属性TEXTFのセクションに配置します。

__farについてはメモリ配置領域指定(__near/__far)を参照してください。

-

#pragma nearを指定した関数は,__callt,__farキーワードを付加した関数であっても,警告なしでキーワードを無視します。

callt関数としたい場合は#pragma nearではなく#pragma calltを指定してください。

-

#pragma farを指定した関数は,__callt,__nearキーワードを付加した関数であっても,警告なしでキーワードを無視します。

-

同一関数に対して#pragma callt,#pragma near,#pragma farが重複した場合は,#pragma callt > #pragma near > #pragma farの優先度で#pragmaが有効になります。

[方法]

-

関数の最初の宣言より前で#pragma near/#pragma farを宣言します。

#pragma near [(] 関数名 [,...][)]
#pragma far [(] 関数名 [,...][)]

[制限]

-

同一関数に対し複数の宣言があり,2度目以降の宣言に作用する位置に#pragma near/#pragma farを記述した場合,動作を保証しません。#pragma near/#pragma farは宣言より前に記述してください。

-

同一関数に対し#pragma callt,#pragma near,#pragma far以外の#pragmaを指定すると,コンパイル・エラーとなります。

-

本#pragma指令の対象となる関数の宣言に__inlineを指定すると,コンパイル・エラーとなります。

[使用例]

#pragma near func1,func3
#pragma far  func2,func3         // func3は#pragma nearが優先されます
 
extern void func1(void);         // #pragma nearの影響で,警告なしで__nearになります
extern void __near func2(void);  // #pragma farの影響で,警告無しで__farになります
extern void __callt func3(void); // #pragma nearの影響で,警告なしで__nearになります
                                 // 警告なしで__calltは無効になります
 
void  main(void)
{
    func1( );
    func2( );
    func3( );
}

[備考]

-

キーワード__near / __far と #pragma near/#pragma farの違いについて

-

#pragma near/#pragma far は複数の関数に対して同時に指定できます。

-

__farキーワードは__calltキーワードや__nearキーワードとの混在を許さずコンパイル・エラーとなります。

-

#pragma near/#pragma far は警告なしで__callt/__near/__farキーワードを無効とします。