C/C++の__PRETTY_FUNCTION__、__FUNCTION__、__func__の違いを徹底解説
C++プログラミングでは、現在実行中の関数名を取得するために__FUNCTION__、__func__、__PRETTY_FUNCTION__という3つのマクロ(定義済み識別子)を利用できます。一見よく似ていますが、それぞれ標準規格への準拠状況や返す情報の詳細さに違いがあります。
__func__と__FUNCTION__の違い
基本的に、__FUNCTION__と__func__は同じ働きをし、どちらも「現在の関数名」を文字列として返します。
__func__はC99およびC++11で標準規格に採用された定義済み変数で、移植性が高いのが特徴です。一部の古いバージョンのC/C++コンパイラでは、__func__のみがサポートされている場合があります。
一方、__FUNCTION__は正式な標準規格ではなく、GCCなどのコンパイラが独自に提供しているものですが、主要なコンパイラのほとんどで広くサポートされており、事実上__func__のエイリアスとして動作します。
__PRETTY_FUNCTION__の違い
__PRETTY_FUNCTION__はGCC(およびClangなど)が提供する拡張機能で、単なる関数名よりも詳細な情報を返します。C++の場合、戻り値の型、所属するクラス名、名前空間、引数の型などを含む関数シグネチャ全体を取得できます。そのため、「どの関数が呼び出されているか」「どのクラスに属しているか」を確認したいデバッグ場面で特に役立ちます。なお、MSVCでは同様の目的で__FUNCSIG__マクロが用意されています。
サンプルコード
#include<iostream>
using namespace std;
class MyClass{
public:
void Class_Function(){
cout << "__PRETTY_FUNCTION__の出力結果: " << __PRETTY_FUNCTION__ << endl;
}
};
void TestFunction(){
cout << "__func__の出力: " << __func__ << endl;
}
main() {
cout << "__FUNCTION__の出力: " << __FUNCTION__ << endl;
TestFunction();
MyClass myObj;
myObj.Class_Function();
}
実行結果
__FUNCTION__の出力: main __func__の出力: TestFunction __PRETTY_FUNCTION__の出力結果: void MyClass::Class_Function()
このように、__func__や__FUNCTION__は関数名だけを返すのに対し、__PRETTY_FUNCTION__はクラス名やシグネチャまで含めた詳細情報を返します。デバッグログやエラーログに関数情報を残したい場合に、これらのマクロを活用すると非常に効果的です。
-
LinuxでのC/C++開発におすすめのIDE 6選|特徴と選び方を解説
テキストエディタだけでは大規模開発は難しい大規模なプロジェクトを単なるテキストエディタだけで管理するのは容易ではありません。そうしたケースでは、IDE(統合開発環境)を活用することで生産性が向上し、ストレスも大幅に軽減されます。IDEにはさまざまな種類があるため、自分のニーズに合ったものを選ぶことが重要です。この記事では、Linuxで利用できるC/C++向けの優れたIDEを6つご紹介します。1. NetBeans(C/C++開発向け)NetBeansは、無料かつオープンソースの人気クロスプラットフォームIDEです。C/C++をはじめ、多くのプログラミング言語に対応しており、コミュニティが開発し
-
Windowsで使えるC++開発向けおすすめIDE 7選
```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe