2013-07-05 35 views
27

tôi muốn làm một cái gì đó như:Làm thế nào tôi có thể phát hiện g ++ và MinGW trong bộ tiền xử lý C++?

#ifdef GCC 
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__; 
#endif 

Vì tôi muốn sử dụng khá PRETTY_FUNCTION này chỉ được hỗ trợ bởi gnu như xa như tôi biết để tôi cần để phát hiện nếu tôi biên soạn cho g ++ và MinGW, Làm thế nào tôi có thể làm điều đó? Tôi đoán tất cả những gì tôi cần biết là các định nghĩa tiền xử lý của trình biên dịch, giống như tôi đã làm cho Microsoft bên dưới.

#ifdef WIN32 
#define LogFuncBegin() gLogger.FuncBegin(__FUNCTION__); 
#define LogFuncEndSuccess() gLogger.FuncEndSuccess(__FUNCTION__); 
#endif 

Tôi có thể phát hiện bộ xử lý trước g ++ và MinGW bằng C++ bằng cách nào?

Trả lời

36

Bạn có thể sử dụng:

#ifdef __GNUC__ 
#ifdef __MINGW32__ 

Để biết thêm vĩ mô của bạn có thể quan tâm this page trong đó cho thấy macro trình biên dịch khác

+0

Các trường hợp thử nghiệm của bạn có bao gồm MinGW-64 không? – jww

+0

@jww Không, nhưng MinGW-64 cũng sẽ xác định macro 32, do đó, điều này sẽ làm việc cho điều đó là tốt. –

+1

Một phiên bản cập nhật mới hơn của danh sách macro trình biên dịch đó là trong [Dự án biên dịch Macros được xác định trước tại sourceforge] (https://sourceforge.net/p/predef/wiki/Home/) – rakslice

23

Đối với GCC:

#ifdef __GNUC__ 

Đối với MinGW:

#ifdef __MINGW32__ 

x86_64-w64-mingw32-gcc định nghĩa cả __MINGW32____MINGW64__.

+2

đã trường hợp thử nghiệm của bạn bao gồm MinGW-64? – jww

+2

Câu trả lời này được viết trước MinGW-64. Nhưng tôi nghĩ rằng định nghĩa vĩ mô '__MINGW32__' là tốt. Vì vậy, vẫn nên làm việc – sedavidw

+0

Đây là một loại điểm tranh luận. Tôi không thể tìm thấy [MinGW-64 được cung cấp bởi dự án] (http://www.mingw.org/) .... Không có ý nghĩa trong việc giải quyết một vấn đề không tồn tại .... – jww