sự khác biệt giữa #if được xác định (WIN32) và #ifdef (WIN32)


116

Tôi đang biên dịch chương trình của mình sẽ chạy trên linux gcc 4.4.1 C99.

Tôi chỉ đặt #defines của mình để tách mã sẽ được biên dịch trên windows hoặc linux. Tuy nhiên, tôi đã gặp lỗi này.

error: macro names must be identifiers.

Sử dụng mã này

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

Tuy nhiên, khi tôi thay đổi thành này, lỗi đã được sửa:

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

Tôi chỉ tự hỏi tại sao tôi lại gặp lỗi đó và tại sao các #defines lại khác nhau?

Cảm ơn nhiều,

Câu trả lời:


161

Nếu bạn sử dụng cú pháp #ifdef, hãy xóa dấu ngoặc.

Sự khác biệt giữa hai là #ifdefchỉ có thể sử dụng một điều kiện duy nhất,
trong khi #if defined(NAME)có thể làm điều kiện phức hợp.

Ví dụ trong trường hợp của bạn:

#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
yeah, nhưng bạn cũng có thể thác #ifdef UNIX với #ifndef Win32, và nhận được sự linh hoạt cùng (không phải là có thể đọc được, tôi đồng ý)
jpinto3912

2
@ jpinto3912 Nhưng mà được thậm chí hairier với||
Aidiakapi

Giá như họ chỉ đi với #if defined(NAME)ngay từ đầu và tránh tạo ra một #ifdeftuyên bố.
Andy

51
#ifdef FOO

#if defined(FOO)

giống nhau,

nhưng để thực hiện nhiều việc cùng một lúc, bạn có thể sử dụng

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

28

#ifdefkiểm tra xem một macro có tên đó đã được xác định hay chưa, #ifđánh giá biểu thức và kiểm tra giá trị thực

#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
Điều này không trả lời câu hỏi. Câu hỏi yêu cầu sự khác biệt giữa #if defined#ifdef.
Hassan Nadeem

1
Đây là lời giải thích tốt nhất về cách #if FOO và #if được xác định (FOO) có thể hoạt động khác nhau.
Paul Beusterien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.