본문 바로가기
개발언어/C++

[C++] #ifdef

by 엔돌슨 2010. 3. 24.
반응형

#ifdef - #define으로 정의된 것이 있는지 검색하고, 없으면 #ifdef 다음줄 내용을 #define선언한다.

#ifndef - #define으로 정의되어 있으면 #define을 해제한다.

 

#ifdef __cplusplus

extern "C" {

#endif

 

- __cplusplus가 define되어있으면 extern "C"{ 를 삽입하라는 뜻

 

- C와 C++간의 링커 재사용을 위해 쓴다. 처음 C++을 설계할때 컴파일러만 새로 설계하고 링커는 기존 라이브러리를 재사용 하기 위해 기존의 C링커를 그대로 사용하는 것이다.

 

-C++에서는 함수 다중선언 등의 기능을 지원하는데 각 함수명을 인자에 따라 다르게 부여하는 Name Mangling 이 된다.

 

- extern "C"{ 는 Name mangling을 하지 않도록 하여 링크가 가능하도록 한다.

만약 C++에서처럼 다른 이름을 부여하면 라이브러리와 링크가 안되게 된다.

 

- 컴파일러가 C++로 동작할 경우에 __cplusplus를 define한다.




The #ifdef and #ifndef Directives

The #ifdef and #ifndef directives perform the same task as the #if directive when it is used with defined( identifier ).

Syntax

#ifdef identifier

#ifndef identifier

is equivalent to

#if defined identifier

#if !defined identifier

You can use the #ifdef and #ifndef directives anywhere #if can be used. The #ifdef identifier statement is equivalent to #if 1 when identifier has been defined, and it is equivalent to #if 0 when identifier has not been defined or has been undefined with the #undef directive. These directives check only for the presence or absence of identifiers defined with #define, not for identifiers declared in the C or C++ source code.

These directives are provided only for compatibility with previous versions of the language. The defined( identifier ) constant expression used with the #if directive is preferred.

The #ifndef directive checks for the opposite of the condition checked by #ifdef. If the identifier has not been defined (or its definition has been removed with #undef), the condition is true (nonzero). Otherwise, the condition is false (0).

Microsoft Specific

The identifier can be passed from the command line using the /D option. Up to 30 macros can be specified with /D.

This is useful for checking whether a definition exists, because a definition can be passed from the command line. For example:

// PROG.CPP
#ifndef test    // These three statements go in your source code.
#define final
#endif

CL /Dtest prog.cpp // This is the command for compilation.

END Microsoft Specific