C + + 名稱裝飾的說明

文章翻譯 文章翻譯
文章編號: 126845 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

Microsoft C + + 編譯器編碼在名稱中包含型別資訊的 C + + 程式中的符號名稱。這就稱為 「 名稱裝飾"或"名稱改變]。這樣的目的是要確保型別安全連結。C + + 語言可讓函式多載化位置具有相同名稱的函式會只辨別從另一個資料型別引數的函式。名稱裝飾會啟用連結器來區分不同版本的多載函式,因為函式的名稱是編碼或以不同方式來裝飾。

其他相關資訊

不同的編譯器廠商有自己的方法或裝飾名稱的演算法。Microsoft 不會發佈其編譯器使用的名稱裝飾,因為可能會在未來變更的演算法。不過,它是有時為了取得函式名稱的裝飾過的版本。比方說,您必須從 Windows DLL 匯出 C + + 函式,用來建置 DLL 的.DEF 檔匯出一節中列出。(雖然宣告具有 __declspec (dllexport) 函數慣用的方法匯出使用 Visual C++,32 位元版的 C + + 函式,但它是仍然有效使用這些產品的.DEF 檔)。若要成功地匯出函式,您需要列出其裝飾的名稱不在原始碼中名稱。

上面所列產品的所有,Microsoft 發佈瀏覽器工具套件。這些工具套件提供可以解譯的函式的裝飾名稱。

如需有關 __declspec(dllexport),按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
132044在程式碼中使用 _declspec(dllimport) 和 _declspec(dllexport)
下列範例程式碼會使用 FormatDName 函式在瀏覽器庫瀏覽器工具組的一部份。 如果要下載瀏覽器工具組,請造訪下列 Microsoft 網站:
http://www.microsoft.com/downloads/details.aspx?FamilyID=621ae185-1c2a-4d6b-8146-183d66fe709d&displaylang=en
函式會傳回未裝飾的形式的名稱傳遞給它。

範例程式碼

   /* Compile options needed: cl /AL getname.cpp bthunkl.obj /link bsc.lib
          (for 16-bit, where getname.cpp is the source file name)
                              cl getname.cpp /link bsc.lib
          (for 32-bit version 4.x and earlier, where getname.cpp is the source
           file name)
   */ 

   #include <iostream.h>
   #include <strstrea.h>

   extern "C"
   {
   #include "hungary.h"
   #include "bsc.h"
   #include "bscsup.h"
   }

   void main( int argc, char *argv[] )
   {
       if ( argc < 2 )
       {
           cout << "Usage: GETNAME decorated-name" << endl;
           return;
       }

       strstream name;

       // Call browser library function to get undecorated name
       name << FormatDname ( argv[1] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );
   }
				
下列範例會使用較新的瀏覽器工具組 5.0 與 Visual C++ 版本 5.0。
   /* Compile options needed: cl /GX getname.cpp /link msbsc50.lib
          (where getname.cpp is the source file name)
   */ 

   #include <iostream>
   #include <strstream>
   #include <windows.h>
   #include "bsc.h"

   using namespace std;

   int main( int argc, char *argv[] )
   {
       Bsc* pbsc;

       if ( argc < 3 )
       {
           cout << "Usage: GETNAME bscfile-name decorated-name" << endl;
           return 1;
       }

       strstream name;

       // Open the browser file
       Bsc::open( argv[1], &pbsc );

       // Call browser library function to get undecorated name
       name << pbsc->formatDname( argv[2] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );

       pbsc->close();
       return 0;
   }
				

屬性

文章編號: 126845 - 上次校閱: 2005年9月1日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbcode kbcompiler kbcpponly kbinfo KB126845 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:126845
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com