多年前曾經發過在 C++ 中取得 function name 的方法 (C++ Get Pretty Type Name),在翻找之前的願望清單時發現當時看到 C 所提供的 __PRETTY_FUNCTION__
。
__PRETTY_FUNCTION__
使用 gcc 編譯的話 __PRETTY_FUNCTION__
的輸出與 __FUNCTION__
相同。若是用 g++ 去編譯 .c 檔,則會出現不同的結果,如下方範例所示 (請原諒我用 powershell 的 compiler)。版本資訊: gcc version 13.1.0 (MinGW-W64 x86_64-msvcrt-posix-seh, built by Brecht Sanders)。
#include <stdio.h>
int foo(float f) {
printf("__FUNCTION__ = %s\n", __FUNCTION__);
printf("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
printf("__FILE__ = %s\n", __FILE__);
printf("__LINE__ = %d\n", __LINE__);
return (int)f;
}
int main () {
float f = 3.14;
int x = foo(f);
printf("%d\n", x);
return 0;
}
> gcc pretty.c && ./a.exe
__FUNCTION__ = foo
__PRETTY_FUNCTION__ = foo
__FILE__ = pretty.c
__LINE__ = 6
3
> g++ pretty.c && ./a.exe
__FUNCTION__ = foo
__PRETTY_FUNCTION__ = int foo(float)
__FILE__ = pretty.c
__LINE__ = 6
3
編譯器實作
而不同版本的編譯器實作亦有差異。 g++ 8.5 前的會保留 foo(float)::__PRETTY_FUNCTION__:
的資訊在 assembly code 中,代表 foo 底下存在一個 string 是 "int foo(float)"
。然而在 g++ 9.1 後這個關聯的資訊就直接消失了,compiler 在編譯時直接將 __PRETTY_FUNCTION__
替換成 string。
g++ 8.5
g++ 9.1