web-dev-qa-db-ja.com

c ++ #ifdef Mac OS Xの質問

私はC++を初めて使用します。現在、グループプロジェクトに取り組んでおり、クラスをラボコンピューター(Windows)とコンピューター(Mac OS X)の両方と互換性を持たせたいと考えています。

ファイルの先頭に配置しているものは次のとおりです。

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

この質問は以前に尋ねられたことに気づきましたが、私の検索では「_MAC」、「TARGET_MAC_OS」、「Macintosh」などの矛盾する答えが返ってきました。 Macと互換性がありますか?現時点では機能していません。

ありがとうございました!

34
Kirsty

この答え によると:

#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

要するに:

#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 
33
orlp

コンパイラに依存します。 #ifdef __Apple__はgccで機能します。

11
koan

小さな修正:#ifdef TARGET_OS_MACは、プラットフォームに応じて0または1を定義するため、OS XとiOSの両方で常にtrueになりますが、Appleが定義されるとTARGET_OS_MACも定義されるため、 #ifdef内でチェックするAppleは無意味です。代わりに#if TARGET_OS_MACを使用できます。すべてのTARGET_ *マクロで同じです。

4
Respiro

マイクロソフトによると、_WIN32は、Windowsの32ビットバージョンと64ビットバージョンの両方をカバーします。そして__Apple__はClangで動作します(少なくともMavericksでは)。したがって、上記のifdefを記述する正しい方法は次のとおりです。

#ifdef __Apple__
    DoSomething();
#Elif _WIN32
    DoSomethingElse();
#else
    GenerateErrorOrIgnore
2
Jon Spencer