ความแตกต่างระหว่าง #if กำหนด (WIN32) และ #ifdef (WIN32)


116

ฉันกำลังรวบรวมโปรแกรมของฉันที่จะทำงานบน linux gcc 4.4.1 C99

ฉันแค่ใส่ #defines เพื่อแยกโค้ดที่จะคอมไพล์บน windows หรือ linux อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้

error: macro names must be identifiers.

โดยใช้รหัสนี้

#ifdef(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

อย่างไรก็ตามเมื่อฉันเปลี่ยนเป็นข้อผิดพลาดได้รับการแก้ไข:

#if defined(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

ฉันแค่สงสัยว่าทำไมฉันถึงได้รับข้อผิดพลาดนั้นและทำไม #defines จึงแตกต่างกัน

ขอบคุณมาก,

คำตอบ:


163

หากคุณใช้ไวยากรณ์ #ifdef ให้ถอดวงเล็บออก

ความแตกต่างระหว่างทั้งสองคือ#ifdefสามารถใช้เงื่อนไขเดียว
ในขณะที่#if defined(NAME)สามารถทำเงื่อนไขผสม

ตัวอย่างเช่นในกรณีของคุณ:

#if defined(WIN32) && !defined(UNIX)
/* Do windows stuff */
#elif defined(UNIX) && !defined(WIN32)
/* Do linux stuff */
#else
/* Error, both can't be defined or undefined same time */
#endif

2
ใช่ แต่คุณสามารถเรียง #ifdef UNIX ด้วย #ifndef WIN32 และได้รับความยืดหยุ่นเช่นเดียวกัน (ฉันไม่เห็นด้วย)
jpinto3912

2
@ jpinto3912 แต่นั่นทำให้ผมดูดีขึ้นด้วย||
Aidiakapi

หากเพียง แต่พวกเขาเพิ่ง#if defined(NAME)เริ่มต้นและหลีกเลี่ยงการสร้าง#ifdefคำสั่ง
Andy

53
#ifdef FOO

และ

#if defined(FOO)

เหมือนกัน,

แต่หากต้องการทำหลายอย่างพร้อมกันคุณสามารถใช้คำนิยามเช่น

#if defined(FOO) || defined(BAR)

28

#ifdefตรวจสอบว่ามีการกำหนดมาโครตามชื่อนั้นหรือไม่#ifประเมินนิพจน์และตรวจสอบค่าที่แท้จริง

#define FOO 1
#define BAR 0

#ifdef FOO
#ifdef BAR
/* this will be compiled */
#endif
#endif

#if BAR
/* this won't */
#endif

#if FOO || BAR
/* this will */
#endif

13
สิ่งนี้ไม่ตอบคำถาม คำถามที่ถามความแตกต่างระหว่างและ#if defined #ifdef
Hassan Nadeem

1
นี่คือคำอธิบายที่ดีที่สุดว่า #if FOO และ #if ที่กำหนด (FOO) สามารถทำงานต่างกันอย่างไร
Paul Beusterien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.