วิธีกำหนดสัญลักษณ์พรีโปรเซสเซอร์ใน Xcode


100

เป็นไปได้ไหมที่จะตั้งค่าสัญลักษณ์สำหรับการคอมไพล์ตามเงื่อนไขโดยการตั้งค่าคุณสมบัติในโปรเจ็กต์ Xcode

จุดมุ่งหมายของฉันคือการสร้างสัญลักษณ์ที่พร้อมใช้งานสำหรับไฟล์ทั้งหมดโดยไม่ต้องใช้การนำเข้า / รวมเพื่อให้ชุดของคลาสทั่วไปสามารถมีลักษณะการทำงานพิเศษในบางโปรเจ็กต์ เช่นเดียวกับต่อไปนี้ แต่มีสัญลักษณ์ของฉันเอง

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

คำตอบ:


116

ไปที่การตั้งค่าเป้าหมายหรือโครงการของคุณคลิกไอคอนรูปเฟืองที่ด้านล่างซ้ายและเลือก "เพิ่มการตั้งค่าที่ผู้ใช้กำหนดเอง" ชื่อการตั้งค่าใหม่ควรเป็นGCC_PREPROCESSOR_DEFINITIONSและคุณสามารถพิมพ์คำจำกัดความของคุณในฟิลด์ด้านขวามือ

ตามความคิดเห็นของ Steph ไวยากรณ์แบบเต็มคือ:

constant_1=VALUE constant_2=VALUE

โปรดทราบว่าคุณไม่จำเป็นต้องใช้เครื่องหมาย "=" หากคุณเพียงแค่ต้องการ # กำหนดสัญลักษณ์แทนที่จะให้ค่า (สำหรับ#ifdefคำสั่ง)


2
ขอบคุณ! สำหรับใครก็ตามที่สนใจไวยากรณ์ดูเหมือน "kVarOne = 5 myVar = 3.0" (ไม่มีเครื่องหมายคำพูด) ฉันพบว่ามันเกิดจากการลองผิดลองถูก Ben คุณสามารถแก้ไขคำตอบของคุณเพื่อระบุได้หรือไม่? ขอบคุณอีกครั้ง.
Steph Thirion

1
คำตอบที่น่าทึ่ง ผมยังมีผมอยู่เพราะเหตุนี้ ขอบคุณขอบคุณขอบคุณ. +1 (ฉันหวังว่ามันจะมากกว่านี้)
Ali Parr

11
FYI ใน Xcode 3.2.4 นั้น "Preprocessor Macros" จะแมปกับ GCC_PREPROCESSOR_DEFINITIONS และ Xcode จะไม่ให้คุณกำหนดผู้ใช้อีกต่อไป (เนื่องจากมีให้ใช้งานแล้ว)
Clay Bridges

11
นี่ไม่ใช่ไอคอนรูปเฟืองที่ด้านซ้ายล่างอีกต่อไป แต่เป็นไอคอนบวกที่ด้านขวาล่างแทน (ของแท็บการตั้งค่าการสร้างของเป้าหมายของคุณ)
Jesse Smith

1
คุณควรอัปเดตคำตอบนี้ ไม่มีไอคอนรูปเฟืองอีกต่อไป
Radu Simionescu

86

คุณไม่จำเป็นต้องสร้างการตั้งค่าที่ผู้ใช้กำหนดเอง การตั้งค่าในตัว "Preprocessor Macros" ใช้งานได้ดี ข้อความแสดงแทน http://idisk.mac.com/cdespinosa/Public/Picture%204.png

หากคุณมีเป้าหมายหรือโปรเจ็กต์หลายรายการที่ใช้ไฟล์คำนำหน้าเดียวกันให้ใช้ Preprocessor Macros Not Used In Precompiled Headers แทนดังนั้นความแตกต่างในนิยามมาโครของคุณจะไม่ทริกเกอร์ชุดส่วนหัวที่คอมไพล์ล่วงหน้าที่ไม่จำเป็น


1
คุณจะทำอย่างไรหากส่วนนี้หายไปจากการตั้งค่าบิลด์
Kevin Laity

3
ทำในสิ่งที่ Ben Gotliebb แนะนำ แต่ในเวอร์ชัน 3.2.4 ของ Xcode "Preprocessor Macros" จะจับคู่กับ GCC_PREPROCESSOR_DEFINITIONS คุณไม่สามารถกำหนดสิ่งที่ผู้ใช้มีอยู่แล้วได้
Clay Bridges

41

เป็นภาคผนวกหากคุณใช้เทคนิคนี้เพื่อกำหนดสตริงในเป้าหมายของคุณนี่คือวิธีที่ฉันต้องกำหนดและใช้พวกมัน:

ในการตั้งค่าบิลด์ -> มาโครตัวประมวลผลล่วงหน้าและใช่แบ็กสแลชมีความสำคัญในคำจำกัดความ:

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

และในซอร์สโค้ด:

objectManager.client.baseURL = APPURL_NSString;

ขอบคุณสำหรับวิธีแก้ปัญหานี้กำลังค้นหาสิ่งที่แน่นอนเช่นนี้ แต่ stack overflow นั้นเต็มไปด้วยโซลูชันที่ซับซ้อนมากเกินไป
David 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 กำหนด (DEBUG) หรือ #ifdef DEBUG
Simo Salminen

น่าแปลกที่ฉันพบว่าตัวเองอยู่ที่นี่ในปี 2019 ด้วย Swift และ Xcode 10.3 ทุกคนที่มีปัญหาเดียวกันที่อธิบายไว้ข้างต้นอาจพบว่ามีประโยชน์ มันทำให้ฉันมี#if DEBUGชีวิตขึ้นมาอย่างแน่นอน:) stackoverflow.com/a/47395485/2778502
jeff-h

1

ในการตอบสนองต่อความคิดเห็นของ Kevin Laity (ดูคำตอบของ cdespinosa) เกี่ยวกับส่วนการประมวลผลล่วงหน้าของ GCC ที่ไม่แสดงในการตั้งค่าการสร้างของคุณทำให้ Active SDK เป็นส่วนที่ระบุว่า (Base SDK) หลังจากนั้นและส่วนนี้จะปรากฏขึ้น คุณสามารถทำได้โดยเลือกเมนู Project> Set Active Target> XXX (Base SDK) ในเวอร์ชันต่างๆของ XCode (Base SDK) อาจแตกต่างกันเช่น (Project Setting หรือ Project Default)

หลังจากที่คุณได้รับส่วนนี้ปรากฏขึ้นคุณสามารถเพิ่มคำจำกัดความของคุณลงในแมโครโปรเซสเซอร์แทนที่จะสร้างการตั้งค่าที่ผู้ใช้กำหนดเอง


1

สำหรับโครงการ Xcode 9.4.1 และ C ++ การเพิ่มconst char*Preprocessor Macros ให้กับทั้งDebugและRelease builds

  1. เลือกโครงการของคุณ

    เลือกโครงการ

  2. เลือกสร้างการตั้งค่า

    เลือกการตั้งค่าการสร้าง

  3. ค้นหา " Preprocessor Macros "

    ค้นหา 1 ค้นหา 2

  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.