Gcc4.4.2およびWinXPVisual Studio C++ 2008でのコンパイル
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
マクロを使って関数名を表示したいので。クロスプラットフォームで使用できるように上記を実行し、LinuxまたはWindowsでコンパイルするときに同じfuncを使用します。
ただし、WinXPでコンパイルしていると、次のエラーが発生します。
__func__ undeclared identifier
このようなマクロを#defineできませんか?
提案をありがとう、
#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は字句を囲む関数の名前です。
__FUNCTION__
マクロはMSVCコンパイラで事前定義されています。次のようにする必要があります。
#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
またはその逆、必要に応じて:
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
C99をサポートするコンパイラでは、明示的なマクロなしで__func__
を使用できるはずです。
もちろん、そのようなマクロを#define
することができます。次に、FUNCTION
のすべてのインスタンスが__func__
に置き換えられます。ただし、明らかに、コンパイラは__func__
を認識していません。 VCは__FUNCTION__
を知っていると思うので、
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
行う可能性があります。