하만(Harman) 세미콘 반도체 설계 과정/임베디드 시스템을 위한 SW 구조설계

하만(Harman) 세미콘 아카데미 6일차 - SW 구조설계(문자와 문자열 처리 / 사용자 정의 함수 구현 )

semicon_designer 2024. 3. 14. 11:02
728x90

[2024.03.14.목] 인천인력개발원 하만 세미콘 아카데미


임베디드 시스템을 위한 SW 구조설계


문자와 문자열 처리 함수


  • C 표준함수
    • printf, scanf, getch등과 같이 기본적으로 제공되는 라이브러리
    • 모든 플랫폼에 적용(getch는 windows만 지원)
    • 호환성이 좋다 = 이식성이 높다
  • 데이터 형식
    • 기본 데이터 형식 - 문자 포함
    • 사용자 정의 데이터 형식 - 구조체 등
    • 문자열은 기본 데이터 형식과 사용자 정의 데이터 형식 사이
  • 입출력의 이해
    • 파일 / 콘솔 / 소켓 / serial port(COM port)에서의 입출력
    • 파일: Data파일( binary / text ) 등 -> binary는 메모장에서 알아볼 수 없는 형태, text는 메모장에서 인식 가능한 글자로 표현
    • 콘솔: 키보드(입력)+모니터(출력)
    • 소켓: TCP/IP(통신 프로토콜)라이브러리 -> 이더넷(Ethernet) - 유/무선
    • UI(User Interface) 
    • GUI(Graphical User Interface): 마우스를 기반으로 동작
  • 스트림: 데이터 송수신을 위한 다리 / 입출력 흐름

  • 표준 입/출력 스트림
    • C언어 기본 스트림 형태
       - stdin: 표준 입력 스트림 / 입출력 장치: 키보드 (std: standard)
       - stdout: 표준 출력 스트림 / 입출력 장치: 모니터
       - stdin: 표준 에러 스트림 / 입출력 장치: 모니터
  • 문자 입출력 함수
    • 출력 함수
      int putchar(int c);
      int fputc(int c, FILE* stream);    //fputc 앞의 f는 파일을 의미, 뒤의 c는 char(문자)를 의미​

      - fuptc에서 FILE* stream을 stdin으로 설정하면 putchar과 같은 동작
    • 입력 함수
      int getchar();
      int fgetc(FILE* stream);​​

      - 1byte 입력
      - fgetc에서 FILE* stream을 stdin으로 설정하면 getchar과 같은 동작
  • 문자열 입출력 함수
    • 출력 함수
      int puts(const char* s);
      int fputs(const char* s, FILE* stream);    //fputc 앞의 f는 파일을 의미, 뒤의 s는 strubg(문자열)를 의미​​

      - fputs에서 FILE* stream을 stdin으로 설정하면 puts과 같은 동작

    • 입력 함수
      char* gets(char* s);
      char* fgets(char* s, int n, FILE* stream);​

      - gets: 입력받은 문자열을 저장할 공간 확보가 전제됨
      - fgets: int n을 통해 입력받을 공간(buf영역)의 크기를 설정 -> n보다 큰 값이 입력되면 공간 크기에 맞는 부분까지만 입력
      - fgets에서 FILE* stream을 stdin으로 설정하면 gets과 같은 동작
  • 입출력 사이 버퍼(안전공간)의 존재
    • 입력 스트림 -> 입력 버퍼 -> 프로그램 -> 출력 버퍼 -> 출력 스트림 
    • 입력 버퍼: 입력을 받는 안전공간
    • 출력 버퍼: 모니터 이외의 통신, 프린터 등의 장비에서 사용됨(스풀링)
    • 여분의 임시 메모리적 특성 -> 성능 향상 목적
  • 버퍼를 비우는 함수
    int fflush(FILE* stream);​​​​


  • 문자열 길이 반환 함수 strlen(const char* s)
    size_t strlen(const char* s)​


  • 문자열 복사 함수 strcpy(char* dest, const char* src);
    #include <string.h>
    char* strcpy(char* dest, const char* src);
    char* strncpy(char* dest, const char* src, size_t n);​


  • 문자열 추가 함수 strcat(char* dest, const char* src);
    #include <string.h>
    char* strcat(char* dest, const char* src);
    char* strncat(char* dest, const char* src, size_t n);​

    • strcat함수: char의 포인터를 반환하는 함수
    • char* dest: 타켓
    • const char* src: 추가하는 문자열

실습: strcat함수


  1. strcat Test를 진행하기 위해 프로토타입으로 void test06();을 선언
  2. main함수 내 void* pf[] array에 test06항목 추가
  3. while 반복문 내 printf("6. 표준함수 테스트\n");을 5번 프린트 아래에 추가하여 메뉴 추가
  4. void test06(){}함수 아래와 같이 작성
    void test06() {
    	char* s1 = "Good";
    	char* s2 = "afternoon";
    
    	//strcat Test
    	printf("s1: %s\n", s1);
    	printf("s1: %s\n", s2);
    	printf("strcat(s1, s2): %s\n", strcat(s1, s2));
    }​


  5. 실행 시 액세스 위반 오류 발생
    이유: s1은 메모리의 const영역에 위치(수정 불가) -> const영역에 있는 s1문자열에 s2를 덧붙여서 확장 불가

  6. 수정 방법:
    1. s1과 s2를 로컬 문자배열로 가져와 적용
    2. fprintf(의미: fileprintf) 또는 sprintf(의미: stringprintf)를 이용
      -> 출력을 콘솔이 아닌 fprintf는 파일로, sprintf는 버퍼로 진행
  7. strcaff를 사용하지 않는 해결방법
    1. buf[100];으로 안전 영역 형성
    2. buf로 출력하기 위해 sprintf(buf, "strcat(s1, s2): %s%s\n", s1, s2); 코드 입력
      ∵strcat에서 s1을 가리키면 상수 영역이므로 동작 불가능
    3. void test06{};의 수정된 코드
      void test06() {
      	char* s1 = "Good";
      	char* s2 = "afternoon";
      	char buf[100];
      
      	//strcat Test
      	printf("s1: %s\n", s1);
      	printf("s2: %s\n", s2);
      	sprintf(buf, "strcat(s1, s2): %s%s\n", s1, s2);	//strcat함수의 타겟이 const영역에 있으므로 불가능
      	printf("%s", buf);
      }​​


    4. 실행


  8. strcaf를 사용한 해결방법
    1. 헤더 파일에 #include <string.h> 포함 
    2. buf 영역을 strcpy(buf, s1);을 이용하여 클리어링
    3. buf 영역에 strcat(buf, s2);을 이용하여 메모리의 const영역이 아닌 buf영역에 s2 내용 추가
    4. 2, 3번을 통해 안전영역 buf에서 과정이 수행되므로 정상적으로 strcat 함수 작동 
    5. printf("strcat(s1, s2): %s\n", buf);를 이용하여 buf영역의 문자열 출력
    6. 최종 void test06()함수 내용
      void test06() {
      	char* s1 = "Good";
      	char* s2 = "afternoon";
      	char buf[100];
      
      	//strcat Test
      	printf("s1: %s\n", s1);
      	printf("s2: %s\n", s2);
      	strcpy(buf, s1);	//buf 클리어 작업
      	strcat(buf, s2);
      	printf("strcat(s1, s2): %s\n", buf);	
      }​


    7. 정상 작동
  9. s1과 s2의 문자열 길이를 출력하기 위해 printf함수 수정
    void test06() {
    	char* s1 = "Good";
    	char* s2 = "afternoon";
    	char buf[100];
    
    	//strcat Test
    	printf("s1: %s (%d)\n", s1, strlen(s1));
    	printf("s2: %s (%d)\n", s2, strlen(s2));
    	strcpy(buf, s1);	//buf 클리어 작업
    	strcat(buf, s2);
    	printf("strcat(s1, s2): %s\n", buf);	
    }​
     
    null을 포함하는 Good 문자열의 길이가 5가 나와야 하나 4가 나오는 이유: strlen함수는 문자의 개수만 count(null은 count 제외)
  10. 다음의 코드로 직접 입력받아 출력도 가능
    void test06() {
    	char* s1;
    	char* s2;
    	char buf[100];
    	
    	s1 = buf;
    	s2 = buf + 50;
    
    	printf("첫 문자열: \n>");
    	scanf("%s", s1);
    	printf("두번째 문자열: \n>");
    	scanf("%s", s2);
    
    
    	//strcat Test
    	printf("s1: %s (%d)\n", s1, strlen(s1));
    	printf("s2: %s (%d)\n", s2, strlen(s2));
    	strcpy(buf, s1);	//buf 클리어 작업
    	strcat(buf, s2);
    	printf("strcat(s1, s2): %s\n", buf);	
    }​

 
[메모리 공간 영역]

Good(주소 100)const
영역
(수정 불가능)
Afternoon(주소 200)
정적 메모리 영역
s100 주소 pointer(지역변수)Local
영역
(수정 가능)
s200 주소 pointer (지역변수)

=> 문자열은 buf를 이용하여 공간 확보

 

  • 문자열 비교 함수 strcmp( , );
    #include <string.h>
    
    int strcmp(const char* s1, const char* s2);
    int strncmp(const char* s1, const char* s2, size_t n);​​
     
    • return > 0 -> s1 > s2
    • return = 0 -> s1 = s2
    • return < 0 -> s1 < s2
    • 첫 인수가 기준이 되어 비교
  • 문자열 -> 숫자 변환 함수: 변환해야 할 자료형이 아닌 다른 자료형이 전달될 경우 에러 발생
    #include <stdlib.h>
    
    int atoi(char *ptr);// 문자열을 int형 데이터로 변환
    long atol(char *ptr);// 문자열을 long형 데이터로 변환
    float atof(char *str);// 문자열을 float형 데이터로 변환​
    - atoi: aschii to integer
    - atol: aschii to long
    - atof: aschii to float
  • 대소문자 변환 함수
    #include <ctypes.h>
    
    int toupper(int c);// 소문자를 대문자로
    int tolower(int c);// 대문자를 소문자로​

실습 1: 문자열 길이 반환하는 length 함수 구현


[ 함수의 설계 ]
- prototype 선언: void copy(char* p1), char* p2);
- 함수명 : copy
- 기능: p2문자열을 인수로 받아 p1문자열로 복사
- 인수: 타겟 문자열, 소스 문자열 (char* p1, char* p2)
- 리턴 값: void(없음)

  1. void test07(); test07함수 포로토타입 선언
  2. 함수의 길이를 반환할 int length(char* str); 함수 프로토타입 선언
    => 문자열의 길이를 반환하므로 반환 자료형 int, 길이를 반환할 문자열이 인수로 들어가야 하므로 인수 char* str 사용
  3. main함수 내의 메뉴를 추가하기 위해 pf배열에 test07을 요소로 추가
    	void* pf[] = { test01, test02, test03, test04, test05, test06, test07 };//type이 정해지지 않은 포인터 배열, 내부의 배열요소는 함수의 주소​


  4. main함수 내 while문에 7번을 선택할 수 있는 선택지 추가를 위한 printf함수 작성
    	while (1) {
    		printf("\n");
    		printf("1. 숫자키에 대한 문자열 출력\n");
    		printf("2. 문자열과 문자배열\n");
    		printf("3. 포인터의 위치 지정\n");
    		printf("4. 포인터를 이용한 문자열 입출력 함수\n");
    		printf("5. 구조체 테스트\n");
    		printf("6. 표준함수 테스트\n");
    		printf("7. 문자열의 길이 반환 함수 구현\n");
    		printf("0. 종료\n");
    		printf("=====================================\n > ");
    		scanf("%d", &n);
    		printf("\n");
    
    		if (n == 0)	return;	//0 입력 시 함수 종료
    
    		pfunc = pf[n - 1];	//배열은 0부터 시작하므로 1을 빼줌
    		pfunc();			//위에서 지정한 함수를 호출
    	}​


  5. test07 함수 내용 작성
    void test07() {
    	char buf[100];
    	printf("문자열 입력:\n>");	scanf("%s", buf);
    
    	printf("\n문자열의 길이: %d\n", length(buf));
    }
    - str 문자열을 설정하고, 이를 입력하기 위한 100byte의 안전공간 buf형성(필수!!)
    - printf를 통해 문자열 입력 칸 지정
    - scanf를 통해 str에 문자열 입력 받음
    - length함수를 통해 받은 문자열 길이 값을 len에 대입

  6. length 함수 구현
    int length(char *str) {
    	int len = 0;
    	while (*(str+len))	len++; //str의 len번째 글자가 null이 나올때까지 실행
    	return len;
    }​
     - 입력된 인수 str의 문자열에 대해, while문 내에서 한 바이트씩 점검
    - 한 바이트씩 넘어가다가 문자열의 값이 0이 나오면(null값 발견) while문 중지 및 현재까지의 길이 return

  7. 실행 확인
    각 길이에 맞게 정상 출력 확인
  8. 교수님 코드 참고:
    void test07(){
    	char buf[100];
        printf("문자열을 입력하세요: "); scanf("%s", buf);
        printf("입력한 문자열의 길이는   [%d]입니다.\n\n", length(buf));
    }
    
    int length(char* str){
    	int len = 0;
        while(!){
        	if (*(str + len) == 0) break;
            len++;
    	}
    }​

실습 2: 두 문자열을 비교하는 compare 함수 구현


두 개의 문자열을 인수로 받아 한 글자씩 비교하여 서로 다른 글자를 반환하는 함수
리턴 값: -1(str1 < str2), 0(str1 = str2), +1(str1 > str2)
1. 문자열을 비교할 실행 함수 test08 프로토타입 선언
void test08();
2. 비교를 수행하는 사용자 정의 함수 선언
int compare(char* str1, char* str2);
3. main함수의 while문 안에 8번 메뉴로 문자열 비교 함수 구현 선택지 추가
printf("8. 문자열의 비교 함수 구현\n");
4. 몇 번째 글자가 다른지 표기하기 위해 diffnum 정수형 변수 선언
5. test08함수 설정(int diffnum은 몇 번째 글자가 다른 지 파악하기 위한 변수)
   - 두 문자열이 같을 때와 다르면 어떤 위치에서 다른 지 표시

int diffnum;

void test08() {

	char str1[100];
	char str2[100];
	int val;

	printf("비교할 문자열을 입력하세요:\n");
	printf("문자열 1: ");
	scanf("%s", str1);
	printf("\n문자열 2: ");
	scanf("%s", str2);
	
	val = compare(str1, str2);

	printf("\n");

	if (val == 0) printf("두 문자열이 같습니다.\n");
	else if (val < 0) printf("문자열 1의 %c와 문자열 2의 %c가 %d번째에서 다릅니다. 문자열 1 문자 < 문자열 2 문자.\n", *(str1 + diffnum-1), *(str2 + diffnum-1), diffnum);
	else if (val > 0) printf("문자열 1의 %c와 문자열 2의 %c가 %d번째에서 다릅니다. 문자열 1 문자 > 문자열 2 문자.\n", *(str1 + diffnum-1), *(str2 + diffnum-1), diffnum);

}


6. 비교를 위한 compare함수 설정

int compare(char* str1, char* str2) {
	int comp = 0;
	int i = 0;
	while (comp == 0 ) {

		if (*(str1 + i) == *(str2 + i))	comp = 0;
		else if (*(str1 + i) < *(str2 + i))	comp = -1;
		else if (*(str1 + i) > *(str2 + i))	comp = 1;
		if ((*(str1 + i) || *(str2 + i)) == 0)   break;
		i++;

	}
	diffnum = i;
	return comp;
}


7. 실행 화면


8. 사용한 전체 코드

#include <stdio.h>
#include <conio.h>
#include <string.h>

void test08();					//문자열을 비교하는 함수

int compare(char* str1, char* str2);

int main()
{
	int n;
	void* pf[] = { test01, test02, test03, test04, test05, test06, test07, test08 };//type이 정해지지 않은 포인터 배열, 내부의 배열요소는 함수의 주소
	void (*pfunc)();								//return값이 없고 인자도 필요 없는 포인터 함수 선언

	while (1) {
		printf("\n");
		printf("1. 숫자키에 대한 문자열 출력\n");
		printf("2. 문자열과 문자배열\n");
		printf("3. 포인터의 위치 지정\n");
		printf("4. 포인터를 이용한 문자열 입출력 함수\n");
		printf("5. 구조체 테스트\n");
		printf("6. 표준함수 테스트\n");
		printf("7. 문자열의 길이 반환 함수 구현\n");
		printf("8. 문자열의 비교 함수 구현\n");
		printf("0. 종료\n");
		printf("=====================================\n > ");
		scanf("%d", &n);
		printf("\n");

		if (n == 0)	return;	//0 입력 시 함수 종료

		pfunc = pf[n - 1];	//배열은 0부터 시작하므로 1을 빼줌
		pfunc();			//위에서 지정한 함수를 호출
	}
}

int diffnum;

void test08() {

		char str1[100];
		char str2[100];
		int val;

		printf("비교할 문자열을 입력하세요:\n");
		printf("문자열 1: ");
		scanf("%s", str1);
		printf("\n문자열 2: ");
		scanf("%s", str2);

		val = compare(str1, str2);

		printf("\n");

		if (val == 0) printf("두 문자열이 같습니다.\n");
		else if (val < 0) printf("문자열 1의 %c와 문자열 2의 %c가 %d번째에서 다릅니다. 문자열 1 문자 < 문자열 2 문자.\n", *(str1 + diffnum - 1), *(str2 + diffnum - 1), diffnum);
		else if (val > 0) printf("문자열 1의 %c와 문자열 2의 %c가 %d번째에서 다릅니다. 문자열 1 문자 > 문자열 2 문자.\n", *(str1 + diffnum - 1), *(str2 + diffnum - 1), diffnum);

	}


int compare(char* str1, char* str2) {
	int comp = 0;
	int i = 0;
	while (comp == 0) {

		if (*(str1 + i) == *(str2 + i))	comp = 0;
		else if (*(str1 + i) < *(str2 + i))	comp = -1;
		else if (*(str1 + i) > *(str2 + i))	comp = 1;
		if ((*(str1 + i) || *(str2 + i)) == 0)   break;
		i++;

	}
	diffnum = i;
	return comp;
}

 

<위 실습까지의 코드 파일>

실습2.c
0.01MB

 
 


파일 입 · 출력


  • 파일 OPEN: 데이터를 주고받는 스트림 생성
    • #include <stdio.h>
      FILE* fopen(const char * filename, const char * mode)
      파일 open(fopen 함수) -> 파일 포인터 리턴
      파일 open(fopen 함수) 실패 -> null 포인터 리턴
    • 파일 open 모드: 접근모드 / 데이터 입출력모드
      - 접근 모드: 사용 용도 결정(r, w, a, r+, w+, a+

      - 데이터 입출력모드: t(텍스트 모드), b(2진 모드)

[ 접근 모드 ]

r(read)읽기 전용으로 파일 오픈
파일명을 필수로 지정해야 호출 가능
w(write)쓰기 전용으로 파일 오픈
파일 지정: 내용을 지우고 새로 생성
파일 미지정: 새로운 파일 생성
a(append)추가 쓰기 전용으로 파일 오픈
파일 지정: 끝부분부터 내용 추가
r+파일을 읽고 쓰기 위해 오픈
파일 지정:  기존 내용 덮어쓰기
파일 미지정:  새로운 파일 생성/저장
w+파일을 읽고 쓰기 위해 오픈
파일 지정:  내용을 지우고 새로 생성
파일 미지정:새로운 파일 생성
a+파일을 읽고 추가로 쓰기 위해 오픈
파일 지정: 끝부분부터 내용 추가

 

  • CR(Carriage Return) / LF(Line Feed)
    • CR(Carriage Return): 앞쪽으로 복귀 ('\r'로 표시)
    • LF(Line Feed): 줄바꿈 ('\n'로 표시)
    • text모드: LF가 자동으로 CRLF로 변환되어 표시
      ex) C프로그램에서 AReference Manual \n -> text파일에서 AReference Manual \r \n
    • binary모드: LF는 LF로 표시
  • 파일 open 모드
    • 파일 접근 모드+ 데이터 입출력모드 = 파일 개방 모드
    • example
      r + b -> "rb"모드
      w+ + t -> "w+t"모드
  • 파일 구조체 포인터
    • fopen 함수의 return형식
    • 파일 구조체 = 파일 포인터
  • 파일 구조체 포인터 용도
    • 데이터 입출력 함수 호출
    • 위치 정보 참조
  • 파일의 종결(close) = 스트림의 종결
    • #include <stdio.h>
      int fclose(FILE * stream)
    • 정상적으로 종료 시 0 return
  • 파일 입출력 함수
기능\스트림키보드/모니터선택(키보드/모니터, 파일)
문자 출력int putcharint fputc(int c, FILE* stream)
문자 입력int getchar(void)int fgetc(FILE* stream)
문자열 출력int puts(const char* s)int fputs(const char* s, FILE* stream)
문자열 입력char* gets(char* s)char* fgets(char* s, int n, FILE* stream)
형식 지정 출력int printf(const* format, ...)int fprintf(FILE* stream, const char* format, ...)
형식 지정 입력int scanf(const char* format, ...)int fscanf(FILE* stream, const char* format, ...)

    FILE* stream: 파일 포인터


메모리 관리와 동적 할당


  • 스택 / 힙 / 데이터 영역
변수별 할당 영역
    • 함수 내부에서 지역변수 선언 -> Stack에 형성 (Local영역 / 함수 내 일시적 존재)
    • 함수 외부에서 전역변수 선언 -> Heap에 형성 (프로그램 내 지속적 존재)
    • 배열의 선언
      • 배열의 길이 선언은 상수로
    • 메모리 동적 할당(malloc 함수)
      • 메모리 공간의 크기를 결정지어 Heap 영역에 할당
        #include <stdlib.h>
        void* malloc(size_t size)​
        - 성공 시 할당 메모리의 첫 번째 주소 리턴, 실패 시 NULL포인터 리턴
        - void: 재정의하라
        - size_t size: byte단위로 크기 재정의

      • 동적 할당 메모리 공간 소멸
        #include <stdlib.h>
        void free(void* ptr)​
        - 메모리 관리를 위해 반드시 실행!!
    • malloc 함수 활용
      • int * i = (int*) malloc(sizeof(int));​
        : Heap 영역에 4바이트를 할당하고 int형으로 재정의하여 *i에 대입하라

매크로와 전처리기


  • 전처리기 지시자
    • #definde으로 시작
    • 컴파일러에 의한 처리 X
    • 형태: #define[전처리기 지시자]   PI[매크로]   3.1415[대체리스트]
    • (example): 모든 PI 글자를 3.1415로 대체하라 -> 컴파일러에 지시
    • #define PI 3.1415
  • 매크로 함수(=치환 문자 함수)
    • 매크로 기반 정의 함수
    • 함수는 아니지만, 함수의 특성을 지님
    • 형태: #define[전처리기 지시자]   SQUARE(x)[매크로, x는 매크로 함수 전달 인자]   x*x[대체 리스트]
  • 매크로 함수의 구현
    • 장점
       - 자료형에 독립적
       - 실행 속도 향상
    • 단점
       - 구현 난이도 상
       - 디버깅이 어려움
    • 매크로 함수의 조건
       - 작은 함수 크기
  • 조건식에 따른 실행 정의 방법
    • (조건식)? a : b;
      => 조건식을 만족하면 a를 return하고, 불만족하면 b를 return
    • 이를 이용한 절댓값 매크로 구현
      #define ABS(x) (x<0)?-x:x;  //x의 값이 0보다 작으면 -를 곱하여 양수로, 양수면 그대로 반환​

모듈화 프로그래밍


  • 모듈(module)
    • 프로그램 구성요소 일부
    • 함수 + 관련 데이터 -> 모듈
  • 모듈화 프로그래밍
    • 기능별로 파일을 분리
    • 유지 보수성 향상
  • 파일 분할 및 컴파일
    • 일부 관련 파일끼리 나누는 작업
    • 주의: 전역변수에 대한 참조
    • (example)
      int i = 0;			//file_1.c로 저장
      
      int main(void){		//main함수를 fil_2.c로 저장
      	i++;
          return 0;
      }​
      위와 같이 두 개의 파일로 저장 시
      -> file_2.c에서 file_1.c에 저장한 전역변수 int i를 사용하기 위해서는 extern int i; 함수 사용
    • file_1.c 저장 코드
      int i = 0;​
    • file_2.c에서 int i를 불러오기 위하여 다음의 코드 사용
      extern int i;
      
      int main(void){
      	i++
          return 0;
      }​
  • 헤더 파일의 포함: 전처리기에 의해 하나의 파일을 다른 파일에 포함시키는 작업

  • 헤더 파일 포함 방법
    • #include <abc.h> => 표준 디렉토리에서 abc.h를 찾아서 포함 (<~~.h>와 같은 형태는 system header)
    • #include "c:/include/abc.h" => c:/include 에서 헤더파일 abc.h를 찾아서 포함
      "c:/include/abc.h": 전체경로
    • #include "plus.h" => 현재 작업 파일(프로그램)이 존재하는 디렉토리 내의 plus.h를 포함
      "plus.h": 상대경로
    • #include "../abc.h"  => 현재 디렉토리보다 한 개 상위 디렉토리 내의 헤더파일(abc,h) 포함
    • #include "../../abc.h"  => 현재 디렉토리보다 두 개 상위 디렉토리 내의 헤더파일(abc.h) 포함
    • #include “c:/header/lib/plus.h” => c:/header/lib에 존재하는 plus.h 포함
  • 컴파일러 지시자 #if, #elif, #else, #endif (적용 필요성 낮음)

  • 헤더파일 포함 관계시 발생 문제
    • 하나의 헤더파일 두 번 이상 포함하는 경우 -> 함수 정의 또는 변수 선언 중복의 발생
    • 조건부 컴파일로 해결 가능
728x90