2011-07-23 20 views
33

Tôi khá mới đối với C++. Tôi hiện đang làm việc trên một dự án nhóm và chúng tôi muốn làm cho các lớp của chúng tôi tương thích với cả máy tính trong phòng thí nghiệm (Windows) và máy tính của tôi (Mac OS X).C++ #ifdef Câu hỏi của Mac OS X

Đây là những gì chúng tôi đã được đặt ở phía trên cùng của file chúng tôi:

#ifdef TARGET_OS_X 
# include <GLUT/glut.h> 
# include <OpenGL/OpenGL.h> 
#elif defined _WIN32 || defined _WIN64 
# include <GL\glut.h> 
#endif 

Tôi nhận ra câu hỏi này đã được hỏi trước nhưng tìm kiếm của tôi đã được đem lại cho tôi câu trả lời mâu thuẫn như "_MAC", "TARGET_MAC_OS "," MACINTOSH ", v.v .. Khai báo hiện tại và chính xác để đưa vào câu lệnh #ifdef để làm cho nó tương thích với Mac là gì? Ngay bây giờ nó không hoạt động.

Cảm ơn bạn!

Trả lời

32

Theo this answer:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 
    #ifdef TARGET_OS_IPHONE 
     // iOS 
    #elif TARGET_IPHONE_SIMULATOR 
     // iOS Simulator 
    #elif TARGET_OS_MAC 
     // Other kinds of Mac OS 
    #else 
     // Unsupported platform 
    #endif 
#endif 

Vì vậy, trong ngắn hạn:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 
    #ifdef TARGET_OS_MAC 
     #include <GLUT/glut.h> 
     #include <OpenGL/OpenGL.h> 
    #endif 
#elif defined _WIN32 || defined _WIN64 
    #include <GL\glut.h> 
#endif 
+1

Tất nhiên, '#ifdef __APPLE__' sẽ đủ nếu OP không nhắm mục tiêu iOS. –

+1

@larsmans: Tốt hơn hãy chắc chắn sau đó xin lỗi. Nếu người dùng quyết định đơn giản hóa, hãy chắc chắn :) – orlp

+4

'TARGET_OS_IPHONE' được xác định cho Trình mô phỏng iOS, vì vậy, bạn cần phải đặt thử nghiệm' TARGET_IPHONE_SIMULATOR' trước khi nó. * Ngoài ra *, cả ba được xác định trên nền tảng của Apple - bạn phải kiểm tra theo giá trị ('#if TARGET_OS_IPHONE' thay vì' #ifdef TARGET_OS_IPHONE'.) –

11

Nó phụ thuộc vào trình biên dịch. #ifdef __APPLE__ hoạt động cho gcc.

1

Theo Microsoft, _WIN32 sẽ bao gồm cả phiên bản 32 bit và 64 bit của Windows. Và __APPLE__ hoạt động cho Clang (ít nhất là ở Mavericks). Vì vậy, một cách chính xác để viết ifdefs trên là:

#ifdef __APPLE__ 
    DoSomething(); 
#elif _WIN32 
    DoSomethingElse(); 
#else 
    GenerateErrorOrIgnore 
1

chỉnh nhỏ: #ifdef TARGET_OS_MAC sẽ giúp bạn luôn luôn đúng trên cả OS X và iOS, vì nó là định nghĩa hoặc là 0 hoặc 1 tùy thuộc vào nền tảng, nhưng khi APPLE được xác định, TARGET_OS_MAC cũng được xác định, vì vậy hãy kiểm tra nó bên trong #ifdef APPLE là vô giá trị. Thay vào đó, bạn có thể muốn sử dụng #if TARGET_OS_MAC. Tương tự cho tất cả các macro TARGET_ *.