簡體   English   中英

為宏__FUNCTION__和__func__定義#define的跨平台

[英]Cross-platform defining #define for macros __FUNCTION__ and __func__

使用gcc 4.4.2和WinXP Visual Studio C ++ 2008進行編譯

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

因為我想使用宏來顯示函數名稱。 我已經做了以上所以我可以跨平台,並在linux或windows上編譯時使用相同的函數

但是,當我在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__應由翻譯者隱式聲明,就像緊接在每個函數定義的__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

可能做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM