多年前曾經發過在 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++ 8.5

OuO

g++ 9.1

g++ 9.1

OuO

Reference

  • ⊛ Back to top
  • ⊛ Go to bottom