본 글은 코드누리의 Windows Programming 강좌를 개인 학습 목적으로 정리한 글 입니다.
ecourse 온라인 강의 – S/W 교육의 새로운 시도
개강 예정 과정입니다. {"title":"\uac1c\uac15 \uc608\uc815 \uacfc\uc815\uc785\ub2c8\ub2e4.","show_title":"1","post_type":"course","taxonomy":"course-cat","term":"COMMINGSOON","post_ids":"","course_style":"popular","featured_style":"course","masonry
www.ecourse.co.kr
// main.c
#include <stdio.h>
#include <windows.h>
#include "square.h"
int main()
{
int n = square(3);
printf("result : %d\n", n);
}
// square.h
#pragma once
int square(int n);
// square.c
#include "square.h"
int square(int n)
{
return n * n;
}
- 위와 같은 C 헤더 파일을 C 파일로 불러와 사용하면 아무런 문제가 없다.
- 하지만 main의 확장자를 .cpp로 변경하면?
- C 파일에선 __cdecl 일 때, square 함수가 어셈블리로 변경될 때 _square가 되었는데
- CPP로 바꾸고 나니 ?square@@YAHH@Z로 바뀐걸 볼 수 있다.
네임 맹글링
맹글링이란?
- 소스 코드에 선언된 함수 또는 변수의 이름을 컴파일 단계에서 컴파일러가 일정한 규칙을 가지고 변경하는 것.
- 컴파일러 회사마다 네임 맹글링 규칙이 다르다.
- C++에서 제공하는 함수 오버로딩 덕분에 함수 이름이 매개변수와 리턴 타입 등과 합쳐져서 맹글링되었고,
- 그로 인해 C와 C++간의 호환성 문제가 생겼다.
- 이를 해결하기 위해서는 C 헤더쪽 함수 선언부 앞에 extern "C" 를 추가해야 한다.
- 그런데 extern "C"는 C++ 문법이라 C 컴파일러가 해석하지 못하므로 #ifdef 매크로로 구분해주어야 한다.
- C++ 컴파일러는 무조건 __cplusplus 매크로가 붙는데 이를 이용해서 아래와 같이 적어준다.
// square.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int square(int n);
#ifdef __cplusplus
}
#endif
'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글
2-2. 실행 파일 포맷 (0) | 2022.09.07 |
---|---|
2-1. 윈도우 핸들과 API (0) | 2022.09.06 |
1-4. Stack Frame (0) | 2022.09.04 |
1-3. Calling Convention (0) | 2022.09.03 |
1-2. MASM 기본 문법 (0) | 2022.09.01 |
댓글