Xcode'da bir önişlemci sembolü nasıl tanımlanır


100

Bir Xcode projesinde özellikler ayarlayarak koşullu derleme için bir sembol ayarlamak mümkün müdür?

Amacım, içe aktar / dahil etmek zorunda kalmadan tüm dosyalara açık bir sembol oluşturmaktır, böylece bir dizi ortak sınıf bazı projelerde özel bir davranışa sahip olabilir. Aşağıdaki gibi, ancak kendi sembollerimle.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

Yanıtlar:


116

Hedef veya Proje ayarlarınıza gidin, sol alttaki Dişli simgesine tıklayın ve "Kullanıcı Tanımlı Ayar Ekle" yi seçin. Yeni ayar adı olmalıdır GCC_PREPROCESSOR_DEFINITIONSve tanımlarınızı sağ taraftaki alana yazabilirsiniz.

Steph'in yorumlarına göre tam sözdizimi şöyledir:

constant_1=VALUE constant_2=VALUE

Not olmadığını gerek sadece bir sembol #define istiyorsanız '=' o (için bir değer vererek yerine, s #ifdefifadeleri)


2
Teşekkürler! İlgilenenler için sözdizimi "kVarOne = 5 myVar = 3.0" (tırnak işaretleri olmadan) gibi görünüyor, onu deneme yanılma yoluyla buldum. Ben bunu belirtmek için cevabınızı düzenleyebilir misiniz? Tekrar teşekkürler.
Steph Thirion

1
Harika cevap. Bu yüzden hala saçım var. Teşekkürler teşekkürler teşekkürler. +1 (Keşke daha fazla olsaydı)
Ali Parr

11
Bilginize, Xcode 3.2.4 itibariyle, "Önişlemci Makroları" GCC_PREPROCESSOR_DEFINITIONS ile eşleşir ve Xcode artık bir kullanıcı tanımlaması yapmanıza izin vermez (zaten mevcut olduğundan).
Kil Köprüler

11
Bu artık sol altta bir Dişli simgesi değil, bunun yerine sağ altta (hedefinizin Yapı Ayarları sekmesinin) Artı simgesidir.
Jesse Smith

1
bu yanıtı güncellemelisiniz. artık dişli simgesi yok
Radu Simionescu

86

Kullanıcı tanımlı bir ayar oluşturmanıza gerek yoktur. Yerleşik "Önişlemci Makroları" ayarı gayet iyi çalışıyor. alternatif metin http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Aynı önek dosyasını kullanan birden çok hedefiniz veya projeniz varsa, bunun yerine Ön İşlemci Makrolarını Kullanılmayan Önceden Derlenmiş Üstbilgilerde kullanın, böylece makro tanımınızdaki farklılıklar gereksiz fazladan önceden derlenmiş üstbilgileri tetiklemez.


1
Bu bölüm yapı ayarlarında eksikse ne yaparsınız?
Kevin Laity

3
Ben Gotliebb'in önerdiğini yapın. Ancak Xcode 3.2.4 sürümünden itibaren "Önişlemci Makroları" GCC_PREPROCESSOR_DEFINITIONS ile eşleşir. Halihazırda mevcut olan bir şeyi kullanıcı tanımlayamazsınız.
Kil Köprüler

41

Ek olarak, hedefinizdeki dizeleri tanımlamak için bu tekniği kullanıyorsanız, onları şu şekilde tanımlamalı ve kullanmalıydım:

Derleme Ayarları -> Önişlemci Makrolarında ve evet ters eğik çizgiler tanımda kritiktir:

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

Ve kaynak kodunda:

objectManager.client.baseURL = APPURL_NSString;

Bu çözüm için teşekkürler, TAM OLARAK buna benzer bir şey arıyor, ancak yığın taşması aşırı karmaşık çözümlerle doludur.
David P

5

*_Prefix.pchDosyayı proje çapında makrolar bildirmek için kullanabilirsiniz . Bu dosya genellikle sizin Diğer Kaynaklar grubunuzdadır.


3

"GCC 4.2 Önişleme" altında (veya sadece arama kutusuna "prepro" yazın) ...

... ancak, hayatım boyunca onu çalıştıramıyorum.

Standart Debug ve Release konfigürasyonlarım var ve debugging konfigürasyonunda DEBUG = 1'i tanımlamak istiyorum. Ancak bunu bir değer olarak ekledikten sonra:

(ayarlar penceresinde)> Önişlemci Makroları: DEBUG = 1

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

... asla basmaz / aranmaz. Bu beni delirtiyor...


10
# İf DEBUG yerine, # if define (DEBUG) veya #ifdef DEBUG deneyin
Simo Salminen

Garip bir şekilde, kendimi burada Swift ve Xcode 10.3 ile 2019'da buldum. Yukarıda açıklananla aynı sorunu yaşayan herkes bunu yararlı bulabilir; kesinlikle #if DEBUGhayatımı getirdi :) stackoverflow.com/a/47395485/2778502
jeff-h

1

Kevin Laity'nin yorumuna yanıt olarak (cdespinosa'nın cevabına bakın), derleme ayarlarınızda gösterilmeyen GCC Önişleme bölümü ile ilgili olarak, Active SDK'yı ondan sonra (Base SDK) yazan biri yapın ve bu bölüm görünecektir. Bunu Proje> Aktif Hedef Ayarla> XXX (Temel SDK) menüsünü seçerek yapabilirsiniz. XCode'un (Temel SDK) farklı sürümlerinde (Proje Ayarı veya Proje Varsayılanı) gibi farklı olabilir.

Bu bölümü aldıktan sonra, kullanıcı tanımlı bir ayar oluşturmak yerine tanımlarınızı İşlemci Makrolarına ekleyebilirsiniz.


1

Xcode 9.4.1 ve C ++ projesi için. Ekleme const char*hem Preprocessor makrolar hata ayıklama ve Release oluşturur.

  1. Projenizi seçin

    proje seç

  2. Derleme Ayarlarını Seçin

    derleme ayarlarını seçin

  3. " Önişlemci Makrolarını " arayın

    arama1 arama2

  4. Etkileşimli listeyi aç

    etkileşimli listeyi aç

  5. Makrolarınızı ekleyin ve tekliften kaçmayı unutmayın

    yol ekle

  6. Kaynak kodda ortak olarak kullanın 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

Önişleme bölümüne sahip olan hedefi kopyalayabilir, istediğiniz herhangi bir adla yeniden adlandırabilir ve ardından Önişlemci makro değerinizi değiştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.