C predefined macros __FILE__,__LINE__,__func__
_MSC_VER
不同的編譯器(gcc,clang,msvc)會設定自己的pre-processor macros。我們可以用這些macro來判斷目前代碼是運行在什麼平台上,或是由什麼編譯器編譯的。
如果使用的是msvc(Microsoft Visual C++)編譯器,那麼將會有_MSC_VER
這個macro。我們可以檢查這個macro是否存在,以此來判斷目前使用的編譯器是否為msvc。
__FILE__,__LINE__,__func__
C語言中有predefined identifier:__func__
,表示所處函數的名稱。
另外還有predefined macro:__FILE__
及__LINE__
,分別表示當前檔案名稱及所在行數。
在TensorRT/samples/common/common.h
中:
#ifdef _MSC_VER
#define FN_NAME __FUNCTION__
#else
#define FN_NAME __func__
#endif
//...
#define CHECK_RETURN_W_MSG(status, val, errMsg) \
do \
{ \
if (!(status)) \
{ \
std::cerr << errMsg << " Error in " << __FILE__ << ", function " << FN_NAME << "(), line " << __LINE__ \
<< std::endl; \
return val; \
} \
} while (0)
注意到以下這段:
#ifdef _MSC_VER
#define FN_NAME __FUNCTION__
#else
#define FN_NAME __func__
#endif
它首先判斷目前使用的編譯器是否為msvc,如果是,則採用__FUNCTION__
做為FN_NAME
,若非msvc,則採用C99中就有的__func__
。
這是因為:
Visual C++, which does not support C99 and
does not yet support all of C++0x, does not provide __func__.
即msvc並未提供__func__
這個macro,所以我們才使用__FUNCTION__
來替代。
參考連結
Home / Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.)
Predefined Identifier __func__ in C
What’s the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__?