[英]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.