기계는 거짓말하지 않는다

#ifdef __cplusplus 매크로의 의미 본문

C++

#ifdef __cplusplus 매크로의 의미

KillinTime 2024. 6. 20. 21:37

C++에서 헤더파일이나 소스코드에 다음과 같은 매크로를 사용할 수 있다.

#ifdef __cplusplus
extern "C" {
#endif

// functions...

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus와 extern "C"를 사용한 위 구문은 C++ 코드에서 

C 스타일의 함수 인터페이스를 사용하도록 하기 위한 것이다.

이 구문은 C++ 컴파일러와 C 컴파일러 간의 링크 호환성을 유지하는 데 사용된다.

#ifdef __cplusplus

위 매크로의 의미는 C++ 코드가 컴파일되고 있음을 나타낸다.
#ifdef __cplusplus는 C++ 컴파일러에서만 이 구문 내부의 코드를 실행하라는 의미이다.

extern "C"

extern "C"는 C++ 컴파일러에 이 블록 내의 함수 선언이 C 함수라는 것을 알려준다.

이는 함수 이름의 매핑 방식을 C 방식으로 변경하여, C와 C++ 간의 링크 호환성을 유지할 수 있게 한다.
C++에서는 함수 오버로딩을 지원하기 위해 함수 이름을 맹글링(name mangling)한다.

그러나 C에서는 함수 이름을 맹글링하지 않기 때문에 extern "C"를 사용하면

C++ 컴파일러가 이 블록 내의 함수 이름을 맹글링하지 않게 된다.

Summary

이 매크로 구문은 헤더 파일을 C와 C++ 양쪽에서 사용할 수 있도록 하기 위한 것이다.

C++에서 이 헤더 파일을 포함할 때 C 스타일의 함수 인터페이스를 제공하여

함수 이름 맹글링 문제를 방지하고, C와 C++ 간의 링크 호환성을 유지할 수 있게 한다.

C 컴파일러에서는 __cplusplus 매크로가 정의되지 않으므로 extern "C" 블록이 무시되고,

C++ 컴파일러에서는 이 블록이 활성화되어 함수 이름 맹글링이 방지된다.

'C++' 카테고리의 다른 글

C++ 문자열에서 JSON 데이터 파싱(parsing)  (0) 2024.07.30
깊은 복사 / 얕은 복사  (0) 2021.05.18
vector, priority_queue 정렬 비교  (0) 2021.05.11
Comments