Bagaimana mendefinisikan simbol preprocessor di Xcode

100

Apakah mungkin untuk menyetel simbol untuk kompilasi kondisional dengan menyiapkan properti dalam proyek Xcode?

Tujuan saya adalah membuat simbol yang tersedia untuk semua file, tanpa harus menggunakan import / include, sehingga sekumpulan kelas umum dapat memiliki perilaku khusus di beberapa project. Seperti berikut ini, tetapi dengan simbol saya sendiri.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
sumber

Jawaban:

116

Buka setelan Target atau Proyek Anda, klik ikon Roda Gigi di kiri bawah, dan pilih "Tambahkan Setelan Buatan Pengguna". Nama pengaturan baru seharusnya GCC_PREPROCESSOR_DEFINITIONS, dan Anda dapat mengetikkan definisi Anda di kolom sebelah kanan.

Per komentar Steph, sintaks lengkapnya adalah:

constant_1=VALUE constant_2=VALUE

Perhatikan bahwa Anda tidak memerlukan '=' jika Anda hanya ingin #menentukan simbol, daripada memberinya nilai (untuk #ifdefpernyataan)

Ben Gottlieb
sumber
2
Terima kasih! Untuk siapa pun yang tertarik, sintaksnya terlihat seperti "kVarOne = 5 myVar = 3.0" (tanpa tanda kutip), saya menemukannya dengan coba-coba. Ben bisakah Anda mengedit jawaban Anda untuk menentukan itu? Terima kasih lagi.
Steph Thirion
1
Jawaban yang luar biasa. Saya masih punya rambut karena ini. Terima kasih terima kasih terima kasih. +1 (Saya berharap bisa lebih)
Ali Parr
11
FYI, pada Xcode 3.2.4, "Makro Preprocessor" dipetakan ke GCC_PREPROCESSOR_DEFINITIONS, dan Xcode tidak akan membiarkan Anda melakukan definisi pengguna lagi (karena sudah tersedia).
Clay Bridges
11
Ini bukan lagi ikon Roda Gigi di kiri bawah, melainkan ikon Plus di kanan bawah (dari tab Pengaturan Bangun target Anda).
Jesse Smith
1
Anda harus memperbarui tanggapan ini. tidak ada ikon roda gigi lagi
Radu Simionescu
86

Anda tidak perlu membuat pengaturan yang ditentukan pengguna. Pengaturan built-in "Preprocessor Macros" bekerja dengan baik. teks alt http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Jika Anda memiliki beberapa target atau proyek yang menggunakan file awalan yang sama, gunakan Makro Preprocessor Tidak Digunakan Dalam Header yang Dikompilasi sebagai gantinya, sehingga perbedaan dalam definisi makro Anda tidak memicu kumpulan tambahan yang tidak perlu dari header yang telah dikompilasi sebelumnya.

cdespinosa.dll
sumber
1
Apa yang Anda lakukan jika bagian ini hilang dari pengaturan build?
Kevin Laity
3
Lakukan apa yang disarankan Ben Gotliebb. Namun pada Xcode versi 3.2.4, "Makro Preprocessor" dipetakan ke GCC_PREPROCESSOR_DEFINITIONS. Anda tidak dapat menentukan pengguna sesuatu yang sudah tersedia.
Clay Bridges
41

Sebagai tambahan, jika Anda menggunakan teknik ini untuk mendefinisikan string dalam target Anda, berikut adalah cara saya mendefinisikan dan menggunakannya:

Di Build Settings -> Preprocessor Macros, dan ya garis miring terbalik sangat penting dalam definisi:

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

Dan di kode sumber:

objectManager.client.baseURL = APPURL_NSString;
Stickley
sumber
Terima kasih untuk solusi ini, telah mencari sesuatu PERSIS seperti ini, namun stack overflow penuh dengan solusi yang sangat rumit.
David P
5

Anda dapat menggunakan *_Prefix.pchfile tersebut untuk mendeklarasikan makro lebar proyek. File itu biasanya ada di grup Sumber Lain Anda .

chunkyguy
sumber
3

Ini ada di bawah "GCC 4.2 Preprocessing" (atau masukkan saja "prepro" di kotak telusur) ...

... Namun, untuk kehidupan saya, saya tidak bisa membuatnya bekerja.

Saya memiliki konfigurasi Debug dan Rilis standar, dan saya ingin mendefinisikan DEBUG = 1 dalam konfigurasi debugging. Tetapi setelah menambahkannya sebagai nilai:

(di jendela pengaturan)> Makro Preprocessor: DEBUG = 1

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

... tidak pernah mencetak / dipanggil. Ini membuatku gila...

hEADcRASH
sumber
10
Alih-alih #if DEBUG, coba #if ditentukan (DEBUG) atau #ifdef DEBUG
Simo Salminen
Anehnya, saya menemukan diri saya di sini pada tahun 2019, dengan Swift dan Xcode 10.3. Siapa pun dengan masalah yang sama yang dijelaskan di atas mungkin menganggap ini membantu; itu pasti menghidupkan saya #if DEBUG:) stackoverflow.com/a/47395485/2778502
jeff-h
1

Menanggapi komentar Kevin Laity (lihat jawaban cdespinosa), tentang bagian GCC Preprocessing yang tidak muncul di setelan build Anda, jadikan Active SDK yang bertuliskan (Base SDK) setelahnya dan bagian ini akan muncul. Anda dapat melakukannya dengan memilih menu Project> Set Active Target> XXX (Base SDK). Dalam versi yang berbeda dari XCode (Base SDK) mungkin berbeda, seperti (Project Setting atau Project Default).

Setelah Anda mendapatkan bagian ini muncul, Anda dapat menambahkan definisi Anda ke Makro Prosesor daripada membuat pengaturan yang ditentukan pengguna.

Mark24x7
sumber
1

Untuk proyek Xcode 9.4.1 dan C ++. Menambahkan const char*Makro Preprocessor ke Debug dan Rilis build.

  1. Pilih proyek Anda

    pilih proyek

  2. Pilih Build Settings

    pilih pengaturan build

  3. Telusuri " Makro Praprosesor "

    pencarian1 pencarian2

  4. Buka daftar interaktif

    buka daftar interaktif

  5. Tambahkan makro Anda dan jangan lupa untuk keluar dari kutipan

    tambahkan jalur

  6. Gunakan dalam kode sumber seperti biasa 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");
    ...
    
Petr Javorik
sumber
0

Anda dapat menduplikasi target yang memiliki bagian preprocessing, mengganti namanya menjadi nama yang Anda inginkan, dan kemudian mengubah nilai makro preprocessor Anda.

kslcam.dll
sumber