# if tanımlıysa (WIN32) ve #ifdef (WIN32) arasındaki fark


116

Linux gcc 4.4.1 C99 üzerinde çalışacak programımı derliyorum.

Windows ya da linux üzerinde derlenecek kodu ayırmak için # tanımlarımı koyuyordum. Ancak bu hatayı aldım.

error: macro names must be identifiers.

Bu kodu kullanarak

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

Ancak, bunu değiştirdiğimde hata düzeltildi:

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

Sadece neden bu hatayı aldım ve # tanımların neden farklı olduğunu merak ediyordum.

Çok teşekkürler,

Yanıtlar:


162

#İfdef sözdizimini kullanıyorsanız, köşeli parantezleri kaldırın.

İkisi arasındaki fark, yani #ifdefsadece tek bir durum kullanabilir
ise#if defined(NAME) bileşik koşul yapabilmesidir.

Örneğin sizin durumunuzda:

#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
evet, ancak #ifdef UNIX'i #ifndef WIN32 ile basamaklandırabilir ve aynı esnekliği elde edebilirsiniz (okunabilir olduğu kadar değil, kabul ediyorum)
jpinto3912

2
@ jpinto3912 Ama bu daha da ||
keskinleşiyor

Keşke #if defined(NAME)başından beri devam etseler ve bir #ifdefifade oluşturmaktan kaçınsalar.
Andy

52
#ifdef FOO

ve

#if defined(FOO)

aynıdır,

ancak birkaç şeyi aynı anda yapmak için tanımlı kullanabilirsiniz.

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

28

#ifdefBu isimde bir makronun tanımlanıp tanımlanmadığını #ifkontrol eder, ifadeyi değerlendirir ve gerçek bir değer olup olmadığını kontrol eder

#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
Bu soruya cevap vermiyor. Soru, #if definedve arasındaki farkı sorar #ifdef.
Hassan Nadeem

1
Bu, #if FOO ve # if tanımlıysa (FOO) nasıl farklı davranabileceğinin en iyi açıklamasıdır.
Paul Beusterien
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.