본문 바로가기
운영체제/[ecourse] Windows Programming

1-5. C++과 MASM

by 헛둘이 2022. 9. 5.

본 글은 코드누리의 Windows Programming 강좌를 개인 학습 목적으로 정리한 글 입니다.

https://www.ecourse.co.kr/

 

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

댓글