#if defined (WIN32)와 #ifdef (WIN32)의 차이점


116

Linux gcc 4.4.1 C99에서 실행되는 프로그램을 컴파일하고 있습니다.

Windows 또는 Linux에서 컴파일 될 코드를 분리하기 위해 #defines를 넣었습니다. 그러나이 오류가 발생했습니다.

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
예,하지만 #ifndef WIN32를 사용하여 #ifdef UNIX를 캐스케이드하고 동일한 유연성을 얻을 수도 있습니다 (읽을 수있는 수준이 아닙니다. 동의합니다).
jpinto3912

2
@ jpinto3912하지만 그와 함께 심지어 더 털이 도착||
Aidiakapi

그들이 #if defined(NAME)처음부터 함께 가서 #ifdef성명서를 작성하는 것을 피 했다면 .
Andy

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 defined (FOO)가 어떻게 다르게 작동 할 수 있는지에 대한 가장 좋은 설명입니다.
Paul Beusterien 19 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.