perbedaan antara #if ditentukan (WIN32) dan #ifdef (WIN32)

116

Saya sedang mengkompilasi program saya yang akan berjalan di linux gcc 4.4.1 C99.

Saya baru saja meletakkan #defines saya untuk memisahkan kode yang akan dikompilasi pada windows atau linux. Namun, saya mendapat kesalahan ini.

error: macro names must be identifiers.

Menggunakan kode ini

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

Namun, ketika saya mengubah ini kesalahan diperbaiki:

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

Saya hanya ingin tahu mengapa saya mendapatkan kesalahan itu dan mengapa #defines berbeda?

Terimakasih banyak,

ant2009
sumber

Jawaban:

161

Jika Anda menggunakan sintaks #ifdef, hapus tanda kurung.

Perbedaan antara keduanya adalah #ifdefhanya bisa menggunakan satu syarat,
sedangkan #if defined(NAME)bisa melakukan kondisional majemuk.

Misalnya dalam kasus Anda:

#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
pengguna44556
sumber
2
ya, tetapi Anda juga dapat mengalirkan #ifdef UNIX dengan #ifndef WIN32, dan mendapatkan fleksibilitas yang sama (tidak seperti yang dapat dibaca, saya setuju)
jpinto3912
2
@ jpinto3912 Tapi itu menjadi lebih hairier dengan||
Aidiakapi
Kalau saja mereka baru saja pergi #if defined(NAME)dari awal dan menghindari membuat #ifdefpernyataan.
Andy
52
#ifdef FOO

dan

#if defined(FOO)

adalah sama,

tetapi untuk melakukan beberapa hal sekaligus, Anda dapat menggunakan didefinisikan, seperti

#if defined(FOO) || defined(BAR)
neha
sumber
28

#ifdefmemeriksa apakah makro dengan nama itu telah ditentukan, #ifmengevaluasi ekspresi dan memeriksa nilai sebenarnya

#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
johannes
sumber
13
Ini tidak menjawab pertanyaan itu. Pertanyaan menanyakan perbedaan antara #if defineddan #ifdef.
Hassan Nadeem
1
Ini adalah penjelasan terbaik tentang bagaimana #if FOO dan #if defined (FOO) dapat berperilaku berbeda.
Paul Beusterien