web-dev-qa-db-ja.com

マクロ__FUNCTION__および__func__の#defineを定義するクロスプラットフォーム

Gcc4.4.2およびWinXPVisual Studio C++ 2008でのコンパイル

#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif

マクロを使って関数名を表示したいので。クロスプラットフォームで使用できるように上記を実行し、LinuxまたはWindowsでコンパイルするときに同じfuncを使用します。

ただし、WinXPでコンパイルしていると、次のエラーが発生します。

__func__ undeclared identifier

このようなマクロを#defineできませんか?

提案をありがとう、

19
ant2009

#defineが後方にあるようです。両方のプラットフォームで__func__を使用する場合、WIN32には__FUNCTION__がありますが__func__はありません。代わりに、次のようにする必要があります。

#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif

__func__を定義する必要があるかどうかを知るためのより良い方法があるかもしれませんが、この簡単なハックでうまくいくはずです。

__FUNCTION__および__func__キーワードをサポートするコンパイラーでは、これらはマクロではないため、以下を実行できないことに注意してください(#ifndef __func__は無効であるため)。

#ifndef __func__
#define __func__ __FUNCTION__
#endif

C99仕様から:

6.4.2.2事前定義された識別子

1識別子__func__は、各関数定義の開始中括弧の直後に宣言が行われるかのように、翻訳者によって暗黙的に宣言されるものとします。

static const char __func__[] = "function-name";

ここで、function-nameは字句を囲む関数の名前です。

25
tomlogic

__FUNCTION__マクロはMSVCコンパイラで事前定義されています。次のようにする必要があります。

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

またはその逆、必要に応じて:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
6
Hans Passant

C99をサポートするコンパイラでは、明示的なマクロなしで__func__を使用できるはずです。

2
Bill Lynch

もちろん、そのようなマクロを#defineすることができます。次に、FUNCTIONのすべてのインスタンスが__func__に置き換えられます。ただし、明らかに、コンパイラは__func__を認識していません。 VCは__FUNCTION__を知っていると思うので、

#if defined ( WIN32 )
#  define __func__ __FUNCTION__
#endif

行う可能性があります。

1
sbi