#pragma map

説明

#pragma map ディレクティブは、ID に対するすべての参照を「name」に変換するようにコンパイラーに命令します。 そして、"name" がオブジェクト・ファイルとアセンブリー・コードで使用されます。

構文

構文図を読む構文図をスキップする>>-#--pragma--map--(--+-identifier---------+--,--"name"--)-----><
                      '-function_signature-'
 

ここで、

identifier 外部結合を持つデータ・オブジェクトまたは非多重定義関数の名前。
C++ のみ ID が多重定義の関数またはメンバー関数の名前である場合は、そのプラグマがコンパイラー生成の名前をオーバーライドする危険性があります。これにより、リンク時に問題が生じます。
function_signature 内部リンクを持つ関数または演算子の名前。 この名前は修飾できます。
name 指定したオブジェクト、関数、または演算子にバインドされる外部名。
C++ のみ C++ 名 (C++ リンケージ・シグニチャーを持つ名前。これが C++ でのデフォルト・シグニチャーです) にリンクする場合はマングル名を指定してください。以下の『』のセクションの『例 4』を参照。

ラベル名が以下と同じ場合、コンパイラーは重大エラー・メッセージを出します。

#pragma map を使用して、以下をマップしないでください。

このディレクティブは、プログラムのどこに指定してもかまいません。 ディレクティブ内に現れる ID は、 プロトタイプ引数リストで使用されるすべての型名を含めて、 実際の発生箇所とは無関係に、 ディレクティブがファイル・スコープで現れた場合と同様に解決されます。

プラグマ・マップで指定された名前が 65535 バイトを超えると、通知メッセージが出され、プラグマが無視されます。

例 1 C のみ

int funcname1()
{
    return 1;
}

#pragma map(func , "funcname1")	//maps func to funcname1 

int main()
{
   return func(); // no function prototype needed in C
}

例 2 C++ のみ

extern "C" int funcname1()
{
  return 0; 
}

extern "C" int func(); //function prototypes needed in C++

#pragma map(func , "funcname1") // maps ::func to funcname1

int main()
{
  return func();
}

例 3 C++ のみ

#pragma map(foo, "bar")

int foo();  //function prototypes needed in C++

int main()
{
   return foo();
}

extern "C" int bar() {return 7;}

以下の例は、#pragma map とアセンブリー・ラベルの間の対話がエラー・メッセージを生成する可能性のある幾つかのケースを示しています。

例 5

 #pragma map(a, "abc")  
 
// error, since the label name is the same as a map name to a 
// different identifier
 int cba asm("abc");   

例 6

 int abc asm("myID");
 
//error, since the same label is used on two different variables 
 int cba asm("myID");  

プラグマ・マップで以前に指定されているラベル名と異なるラベル名を持つ宣言に asm ラベル指定が適用されると、コンパイラーがエラー・メッセージを生成します。

例 7

 #pragma map(a, "aaa") 
 
// severe error, since "a" is already mapped by pragma map to a 
// different name 
 void a() asm("bbb");   

例 8

 #pragma map(a, "aaa") 
 
// Valid declaration, Since "a" is mapped to the same name 
 int a asm("aaa");  

プラグマ・マップが ID のマップ名を指定したとき、その名前が、異なる宣言にある以前のアセンブリー・ラベルのマップ名と矛盾している場合、#pragma map は無視され、警告メッセージが表示されます。

例 9

 int a asm("abc"); 

// Warning message,  since 'abc' is already used as a label name 
 #pragma map(b, "abc") 

#pragma map がすでにアセンブリー・ラベルを持っている ID をマップしようとすると、プラグマ・マップは無視され、警告メッセージが表示されます。

例 10

int a asm("abc");

 //Warning, since 'a' already has a label, pragma map is ignored 
 #pragma map(a, "aaa") 

例 11

int a asm("abc");
 
// Valid declaration, Since "a" is mapped to the same name 
 #pragma map(a, "abc")