亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在C語言中以編程的方式獲取函數名

2019-11-17 04:59:40
字體:
來源:轉載
供稿:網友

  僅僅為了獲取函數名,就在函數體中嵌入硬編碼的字符串,這種方法單調乏味還易導致錯誤,不如看一下怎樣使用新的C99特性,在程序運行時獲取函數名吧。

  對象反射庫、調試工具及代碼分析器,經常會需要在運行時訪問函數的名稱,直到不久前,唯一能完成此項任務并且可移植的方法,是手工在函數體內嵌入一個帶有該函數名的硬編碼字符串,不必說,這種方法非常單調無奇,并且輕易導致錯誤。本文將要演示怎樣使用新的C99特性,在運行時獲取函數名。

  那么怎樣以編程的方式從當前運行的函數中得到函數名呢?

  答案是:使用__FUNCTION__ 及相關宏。

  引出問題

  通常,在調試中最讓人心煩的階段,是不斷地檢查是否已調用了特定的函數。對此問題的解決方法,一般是添加一個cout或PRintf()——假如你使用C語言,如下所示:

void myfunc()
{
cout<<"myfunc()"<<endl;
//其他代碼
}
  通常在一個典型的工程中,會包含有數千個函數,要在每個函數中都加入一條這樣的輸出語句,無疑難過上“蜀山”啊,因此,需要有一種機制,可以自動地完成這項操作。

  獲取函數名

  作為一個C++程序員,可能經常碰到 __TIME__、__FILE__、__DATE__ 這樣的宏,它們會在編譯時,分別轉換為包含編譯時間、處理的轉換單元名稱及當前時間的字符串。

  在最新的ISO C標準中,如大家所知的C99,加入了另一個有用的、類似宏的表達式__func__,其會報告未修飾過的(也就是未裁剪過的)、正在被訪問的函數名。請注重,__func__不是一個宏,因為預處理器對此函數一無所知;相反,它是作為一個隱式聲明的常量字符數組實現的:

static const char __func__[] = "function-name";
  在function-name處,為實際的函數名。為激活此特性,某些編譯器需要使用特定的編譯標志,請查看相應的編譯器文檔,以獲取具體的資料。

  有了它,我們可免去大多數通過手工修改,來顯示函數名的苦差事,以上的例子可如下所示進行重寫:

void myfunc()
{
cout<<"__FUNCTION__"<<endl;
}
  官方C99標準為此目的定義的__func__標識符,確實值得大家關注,然而,ISO C++卻不完全支持所有的C99擴展,因此,大多數的編譯器提供商都使用 __FUNCTION__ 取而代之,而 __FUNCTION__ 通常是一個定義為 __func__ 的宏,之所以使用這個名字,是因為它已受到了大多數的廣泛支持。

  在Visual Studio 2005中,默認情況下,此特性是激活的,但不能與/EP和/P編譯選項同時使用。請注重在IDE環境中,不能識別__func__ ,而要用__FUNCTION__ 代替。

  Comeau的用戶也應使用 __FUNCTION__ ,而不是 __func__ 。

  C++ BuilderX的用戶則應使用稍稍不同的名字:__FUNC__ 。

  GCC 3.0及更高的版本同時支持 __func__ 和__FUNCTION__ 。

  一旦可自動獲取當前函數名,你可以定義一個如下所示顯示任何函數名的函數:

void show_name(const char * name)
{
cout<<name<<endl;
}

void myfunc()
{
show_name(__FUNCTION__); //輸出:myfunc
}

void foo()
{
show_name(__FUNCTION__); //輸出:foo
}
  因為 __FUNCTION__ 會在函數大括號開始之后就立即初始化,所以,foo()及myfunc()函數可在參數列表中安全地使用它,而不用擔心重載。

  簽名與修飾名

  __FUNCTION__ 特性最初是為C語言設計的,然而,C++程序員也會經常需要有關他們函數的額外信息,在Visual Studio 2005中,還支持另外兩種非標準的擴展特性:__FUNCDNAME__ 與 __FUNCSIG__ ,其分別轉譯為一個函數的修飾名與簽名。函數的修飾名非常有用,例如,在你想要檢查兩個編譯器是否共享同樣的ABI時,就可派得上用場,另外,它還能幫助你破解那些含義模糊的鏈接錯誤,甚至還可用它從一個DLL中調用另一個用C++鏈接的函數。在下例中,show_name()報告了函數的修飾名:

void myfunc()
{
show_name(__FUNCDNAME__); //輸出:?myfunc@@YAXXZ
}
  一個函數的簽名由函數名、參數列表、返回類型、內含的命名空間組成。假如它是一個成員函數,它的類名和const/volatile限定符也將是簽名的一部分。以下的代碼演示了一個獨立的函數與一個const成員函數簽名間的不同之處,兩個函數的名稱、返回類型、參數完全相同:

void myfunc()
{
show_name(__FUNCSIG__); // void __cdecl myfunc(void)
}

strUCt S
{
void myfunc() const
{
show_name(__FUNCSIG__); //void __thiscall S::myfunc(void) const

}
};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本在线观看天堂男亚洲| 日本成人激情视频| 国产日产欧美精品| 欧美亚洲激情视频| 亚洲精品国产美女| 亚洲欧美一区二区三区四区| 秋霞av国产精品一区| 国产精品露脸av在线| 国产噜噜噜噜噜久久久久久久久| 亚洲精品一区中文字幕乱码| 国产成人精品一区二区在线| 欧美日韩亚洲精品一区二区三区| 日韩视频在线免费| 亚洲成色777777在线观看影院| 国产成人avxxxxx在线看| 中文字幕亚洲欧美日韩2019| 日产日韩在线亚洲欧美| 高清一区二区三区四区五区| 欧洲亚洲妇女av| 欧美国产日韩xxxxx| 欧美在线不卡区| 亚洲精品www久久久| 午夜精品一区二区三区在线视| 免费97视频在线精品国自产拍| 亚洲免费人成在线视频观看| 久久躁日日躁aaaaxxxx| 久久久久久久久91| 亚洲国产精品福利| 成人两性免费视频| 亚洲网在线观看| 日本一区二区三区四区视频| 欧美国产视频日韩| 亚洲香蕉在线观看| 国产精品爽黄69| 日韩av免费一区| 日韩欧美国产黄色| 中文字幕精品影院| 日韩欧美一区视频| 欧日韩不卡在线视频| 深夜成人在线观看| 亚洲精品v欧美精品v日韩精品| 精品免费在线观看| 91av视频在线| 日韩精品在线电影| 欧美色欧美亚洲高清在线视频| 欧美日韩国产一中文字不卡| 在线观看国产精品91| 欧美精品久久久久久久免费观看| 欧美成人精品三级在线观看| 精品久久久久久久久久| 欧美性xxxx极品hd满灌| 91精品国产网站| 欧美大奶子在线| 国产一区二区三区在线| 欧美寡妇偷汉性猛交| 俺去了亚洲欧美日韩| 国产精品成人久久久久| 456国产精品| 久久久精品欧美| 国产日韩欧美在线观看| 国产偷国产偷亚洲清高网站| 亚洲免费视频网站| 亚洲摸下面视频| 久久网福利资源网站| 一区二区亚洲精品国产| 久久精品在线视频| 51色欧美片视频在线观看| 国产一区二区三区在线视频| xxav国产精品美女主播| 国产国语刺激对白av不卡| y97精品国产97久久久久久| 日本一本a高清免费不卡| 一本色道久久88精品综合| 欧美电影在线观看完整版| 中文字幕亚洲无线码在线一区| 久久视频在线看| 欧美性猛交xxxx| 久久久亚洲影院| 亚洲伊人久久大香线蕉av| 日韩欧美在线中文字幕| 亚洲午夜精品久久久久久久久久久久| 国产日韩欧美黄色| 91精品国产成人www| 亚洲欧美三级伦理| 97超级碰碰人国产在线观看| 亚洲欧洲免费视频| 亚洲激情视频网站| 精品高清美女精品国产区| 亚洲精品国产综合区久久久久久久| 午夜精品久久久久久久久久久久久| 97超碰蝌蚪网人人做人人爽| 欧美大片欧美激情性色a∨久久| 日韩激情av在线播放| 在线观看视频99| 成人在线视频福利| 欧美高清自拍一区| www.精品av.com| 国内精品久久久久久久| 国产欧美一区二区三区四区| 国产精品成人国产乱一区| 5566日本婷婷色中文字幕97| 黑人精品xxx一区| 成人乱人伦精品视频在线观看| 日韩高清av在线| 久久精品一本久久99精品| 国产日韩视频在线观看| 久久久久免费精品国产| 午夜精品美女自拍福到在线| 黄色91在线观看| 亚洲欧美在线x视频| 国产精品视频免费在线观看| 成人福利在线观看| 国产69久久精品成人| 亚洲欧美视频在线| 欧美成人在线影院| 亚洲男女自偷自拍图片另类| 亚洲欧美制服丝袜| 日韩日本欧美亚洲| 国内精品在线一区| 国内精品伊人久久| 国产性猛交xxxx免费看久久| 久久久久久久网站| 在线视频精品一| www.色综合| 在线免费看av不卡| 久久久之久亚州精品露出| 成人激情视频小说免费下载| 日韩电影中文字幕一区| 亚洲天堂av图片| 国产在线精品播放| 国产成人精品电影| 精品女同一区二区三区在线播放| 91九色在线视频| 国产精品免费久久久久久| 久久久久久久久久久免费| 91精品久久久久久久久久入口| 精品久久久久久久久久久| 亚洲激情成人网| 色无极影院亚洲| 国产精品视频资源| 全亚洲最色的网站在线观看| 久久91亚洲精品中文字幕| 国内免费久久久久久久久久久| 亚洲裸体xxxx| 美日韩在线视频| 在线播放精品一区二区三区| 日韩av影院在线观看| 国产精品白嫩初高中害羞小美女| 热久久视久久精品18亚洲精品| 国产一区二区三区四区福利| 亚洲天堂日韩电影| 亚洲第一区中文99精品| 欧美日韩国产999| 国产精品电影网| 91精品啪aⅴ在线观看国产| 96精品视频在线| 国产91成人video| 欧美日韩美女在线观看| 精品国模在线视频| 亚洲色图17p| 在线成人激情黄色| 精品亚洲一区二区三区四区五区| 久久艹在线视频| 久久网福利资源网站|