різниця між #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 відрізняються?

Велике дякую,

Відповіді:


161

Якщо ви використовуєте синтаксис #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заяви.
Енді

52
#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.
Хасан Надей

1
Це найкраще пояснення того, як #if FOO і #if визначені (FOO) можуть поводитися по-різному.
Paul Beusterien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.