Xcodeでプリプロセッサシンボルを定義する方法


100

Xcodeプロジェクトでプロパティを設定して、条件付きコンパイルのシンボルを設定することは可能ですか?

私の目的は、インポート/インクルードを使用せずに、すべてのファイルで使用できるシンボルを作成して、いくつかのプロジェクトで一連の共通クラスが特別な動作を持つようにすることです。次のようですが、自分のシンボルを使用します。

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

回答:


116

ターゲットまたはプロジェクト設定に移動し、左下の歯車アイコンをクリックして、「ユーザー定義設定を追加」を選択します。新しい設定名はである必要がありGCC_PREPROCESSOR_DEFINITIONS、右側のフィールドに定義を入力できます。

ステフのコメントによると、完全な構文は次のとおりです。

constant_1=VALUE constant_2=VALUE

シンボルに値を与えるのではなく、単にシンボルを#defineしたいだけなら、 '=' は必要ないことに注意してください(#ifdefステートメント用)


2
ありがとう!誰にとっても、構文は "kVarOne = 5 myVar = 3.0"(引用符なし)のように見えますが、試行錯誤で見つけました。ベンは答えを編集してそれを指定できますか?再度、感謝します。
Steph Thirion、2008

1
すばらしい答え。このため、まだ髪が残っています。ありがとう、ありがとう、ありがとう。+1(もっとあればいいのですが)
Ali Parr

11
参考までに、Xcode 3.2.4以降、「プリプロセッサマクロ」はGCC_PREPROCESSOR_DEFINITIONSにマッピングされ、Xcodeではユーザー定義を実行できなくなりました(すでに利用可能であるため)。
クレイブリッジ

11
これは、左下の歯車アイコンではなく、右下の(ターゲットの[ビルド設定]タブの)プラスアイコンではなくなりました。
ジェシースミス

1
この応答を更新する必要があります。歯車のアイコンはもうありません
Radu Simionescu 2016

86

ユーザー定義の設定を作成する必要はありません。組み込み設定の「プリプロセッサマクロ」は問題なく機能します。 代替テキストhttp://idisk.mac.com/cdespinosa/Public/Picture%204.png

同じプレフィックスファイルを使用する複数のターゲットまたはプロジェクトがある場合は、代わりにプリコンパイル済みヘッダーで使用されないプリプロセッサマクロを使用してください。マクロ定義の違いが、不要な追加のプリコンパイル済みヘッダーセットをトリガーしないようにします。


1
このセクションがビルド設定にない場合はどうしますか?
ケビンレイティ

3
Ben Gotliebbの提案に従ってください。ただし、Xcodeのバージョン3.2.4以降、「プリプロセッサマクロ」はGCC_PREPROCESSOR_DEFINITIONSにマッピングされます。すでに利用可能なものをユーザー定義することはできません。
クレイブリッジ

41

補足として、このテクニックを使用してターゲットで文字列を定義している場合、これを定義して使用する必要がありました。

ビルド設定->プリプロセッサマクロで、はい、バックスラッシュは定義で重要です:

APPURL_NSString=\@\"www.foobar.org\"

そしてソースコードでは:

objectManager.client.baseURL = APPURL_NSString;

この解決策をありがとう、まさにこのような何かを探していましたが、スタックオーバーフローは複雑な解決策でいっぱいです。
デビッドP

5

この*_Prefix.pchファイルを使用して、プロジェクト全体のマクロを宣言できます。そのファイルは通常、他のソースグループにあります。


3

それは「GCC 4.2 Preprocessing」の下にあります(または単に「prepro」を検索ボックスに入力します)...

...しかし、私の人生では、それを機能させることはできません。

標準のデバッグおよびリリース構成があり、デバッグ構成でDEBUG = 1を定義したい。しかし、それを値として追加した後:

(設定ウィンドウ内)>プリプロセッサマクロ:DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

...印刷/呼び出されることはありません。それは私を夢中にさせています...


10
#if DEBUGの代わりに、#if defined(DEBUG)または#ifdef DEBUGを試してください
Simo Salminen

不思議なことに、私は2019年にSwiftとXcode 10.3を使用して自分自身を見つけました。上記と同じ問題を抱えている人なら誰でも、これが役立つでしょう。それは確かに私#if DEBUGに命を
吹き込みました

1

Kevin Laityのコメント(cdespinosaの回答を参照)への回答として、ビルド設定にGCC Preprocessingセクションが表示されていないことについて、Active SDKを(Base SDK)と表示すると、このセクションが表示されます。これを行うには、[プロジェクト]> [アクティブターゲットの設定]> [XXX(ベースSDK)]を選択します。XCode(Base SDK)の異なるバージョンでは、(プロジェクト設定またはプロジェクトデフォルト)のように異なる場合があります。

このセクションが表示されたら、ユーザー定義の設定を作成するのではなく、プロセッサマクロに定義を追加できます。


1

Xcode 9.4.1およびC ++プロジェクトの場合。デバッグビルドとリリースビルドのconst char*両方にプリプロセッサマクロを追加します。

  1. プロジェクトを選択してください

    プロジェクトを選択

  2. ビルド設定を選択

    ビルド設定を選択

  3. プリプロセッサマクロ」を検索

    search1 search2

  4. インタラクティブリストを開く

    インタラクティブリストを開く

  5. マクロを追加し、引用をエスケープすることを忘れないでください

    パスを追加

  6. 一般的なソースコードで使用 const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...

0

前処理セクションを持つターゲットを複製し、任意の名前に変更してから、プリプロセッサマクロの値を変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.