쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트 필드 C Express.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C 프로그래밍 I.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 7. 조건문.
컴퓨터 프로그래밍 기초 [Final] 기말고사
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
C 12장. 고급 기능 #include <stdio.h> int main(void) { int num;
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
기초C언어 제14주 전처리 및 비트 필드, 스트림과 파일 입출력(15,16장) 컴퓨터시뮬레이션학과 2016년 봄학기
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
-Part3- 제5장 전처리기와 파일 분할 컴파일
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
제15장 전처리 및 비트연산.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
26. 매크로와 전처리기.
C언어 콘서트 제2장 기초 사항.
2주차: 변수, 수식, Control Flow.
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express.
11장. 1차원 배열.
C#.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express Slide 1 (of 27)
제 11 장 전처리기.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
제13장 전처리 및 기타기능.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
C 3장. 변수와 데이터형 #include <stdio.h> int main(void) { int num;
제 4장 전처리기와 매크로 Hello!! C 언어 강성호 김학배 최우영.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
연산자 (Operator).
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
제 3 강.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
빌드 성공.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
제10장 전처리기 문봉근.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
어서와 C언어는 처음이지 제21장.
윈도우에서의 유니코드.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
개정판 누구나 즐기는 C언어 콘서트 제14장 전처리와 분할 컴파일리 출처: pixabay.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트 필드 C Express

이번 장에서 학습할 내용 전처리와 기타 중요한 테마에 대하여 학습한다. 전처리 지시자 다중 소스 프로그램 비트 필드

전처리기란? 전처리기(preprocessor): 컴파일에 앞서 소스 파일을 처리 수고했어, 나머지는 나한테 맡겨! #include, #define 등을 처리 합니다. 소스 파일 임시 파일 오브젝트 파일 전처리기 컴파일러

단순 매크로 단순 매크로(macro): 기호 상수 정의 전처리기 #define SIZE 100 사람은 숫자보다 기호를 잘 기억 하므로 3.141592 보다는 PI가 낫죠! #define SIZE 100 #define PI 3.141592 #define SIZE 100 while (i < SIZE) { sum += i; i++; } while (i < 100) { sum += i; i++; } 전처리기

단순 매크로의 장점 프로그램의 가독성 향상 상수 변경이 용이 리터럴을 사용하는 경우: 모든 곳을 수정해야 함 기호 상수를 사용하는 경우: 정의된 부분만 수정하면 됨

단순 매크로의 예 #define SIZE 100 // 배열 크기 #define MAX_INT 2147483647 // 최대정수 #define PI 3.141592 // 원주율 #define TWOPI (3.141592 * 2.0) // 원주율의 2배 #define EOF (-1) // 파일의 끝 표시 #define DIGITS "0123456789" // 문자열 상수 정의 #define BRACKET "(){}[]" // 문자열 상수 정의 #define MAX_LEN 100 // 문자열 최대 길이 #define MAX_SIZE (MAX_LEN + 1) // 문자 배열 최대 크기 #define EXPR x = y + 1; p = "abc" // 어떤 형태라도 정의 가능

함수형 매크로 함수형 매크로: 함수처럼 인자를 가질 수 있는 매크로 #define SQUARE(x) ((x) * (x)) v = SQUARE(3); v = ((3) * (3)); #define SUM(x, y) ( (x) + (y) ) #define AVERAGE(x, y, z) ( ( (x) + (y) + (z) ) / 3 ) #define MAX(x, y) ( (x) > (y) ) ? (x) : (y) ) #define ABS(x) ( (x) < 0 ) ? -(x) : (x) ) #define getchar() getc(stdin) #define putchar(c) putc((c), stdout)

주의할 점 #define SQUARE(x) x * x // 위험 !! v = SQUARE(1 + 2); 함수형 매크로에서는 인자와 전체를 괄호로 둘러싸는 것이 안전합니다.

함수형 매크로의 장단점 함수 호출보다 실행 속도가 빠름 큰 매크로를 많이 사용하면 실행 프로그램 크기 증가 디버깅이 어려움 함수에 비해 위험 #define SQUARE(x) ((x) * (x)) n = 1; v = SQUARE(++n); //  v = ((++n) * (++n)); // n = 3, v = 9 or 6 int square(int x) { return x * x; } n = 1; v = square(++n); // n = 2, v = 4

예제 #include <stdio.h> #define SQUARE(x) ((x) * (x)) int main(void) { int x = 2; printf("%d\n", SQUARE(x)); printf("%d\n", SQUARE(3)); printf("%f\n", SQUARE(1.2)); printf("%d\n", SQUARE(x+3)); printf("%d\n", 100/SQUARE(x)); printf("%d\n", SQUARE(++x)); // 논리 오류 return 0; } 4 9 1.440000 25 16

매크로 정의 해제 #undef 매크로: 매크로에 대한 정의 취소(undefine) #define SIZE 10 … #undef SIZE int SIZE; 긴 매크로 처리 방법: 한 줄 이상이면 반드시 끝에 연속 마크(\) 사용 #define OUT_ERROR(code, message) \ printf("[%d] %s\n", \ (code), (message))

매크로 연산자 # 연산자: 매크로 인자를 문자열로 변환 (전위 단항 연산자) #define PRINT(exp) printf(#exp " = %d\n", (exp)) x = 1; PRINT(x + 2); // printf("x + 2" " = %d\n", (x + 2)); //  printf("x + 2 = %d\n", (x + 2)); //  x + 2 = 3 ## 연산자: 하나의 토큰으로 병합 (이항 연산자) #define VAR(n) v##n #define TOKEN(name, n) name ## n VAR(1) = 2; // v1 = 2; s = TOKEN(sum, 2); // s = sum2;

예제 #include <stdio.h> #define MAKE_NAME(n) v ## n #define PRINT(n) printf("v" #n " = %d\n", MAKE_NAME(n)); int main(void) { int MAKE_NAME(1) = 10; // int v1 = 10; int MAKE_NAME(2) = 20; // int v2 = 20; PRINT(1); // printf("v1 = %d\n", v1); PRINT(2); // printf("v2 = %d\n", v2); return 0; } v1 = 10 v2 = 20

내장 매크로 내장 매크로: 미리 정의된 매크로 매크로 값 __DATE__ 컴파일 날짜(문자열) __TIME__ 컴파일 시간(문자열) __FILE__ 소스 파일 이름(문자열) __LINE__ 현재 라인 번호(정수) printf("컴파일 시간 = %s %s\n", __DATE__, __TIME__); // 컴파일 시간 = Oct 9 2012 13:03:04 printf("에러 발생: 파일 이름 = %s, 라인 번호 = %d\n", __FILE__, __LINE__);

예제: ASSERT 매크로 #include <stdio.h> #include <stdlib.h> #define ASSERT(exp) \ if (!(exp)) \ printf("[%s %d] 조건 실패: " #exp "\n", __FILE__, __LINE__), exit(1) int main(void) { int sum; ASSERT(sum == 0); return 0; } [assert.c 10] 조건 실패: sum == 0

비트 조작 매크로 #define BIT_GET(w, k) (((w) >> (k)) & 0x01) 결과: 0 / 1 #define BIT_SET (w, k) ((w) | 0x01 << (k)) w의 k번째 비트를 1로 설정 #define BIT_RESET(w, k) ((w) & ~(0x01 << (k))) w의 k번째 비트를 0로 설정

예제: 비트 조작 매크로 #include <stdio.h> #define BIT_GET(w, k) (((w) >> (k)) & 0x01) #define BIT_SET(w, k) ((w) | 0x01 << (k)) #define BIT_RESET(w, k) ((w) & ~(0x01 << (k))) int main(void) { int data = 0; data = BIT_SET(data, 2); printf("%08X %d\n", data, BIT_GET(data, 2)); data = BIT_RESET(data, 2); return 0; } 00000004 1 00000000 0

조건부 컴파일 지시자 #if 조건: 조건이 참이면 조건: 정수 상수 조건이어야 하고 논리, 관계 연산자 등 허용 #ifdef 매크로: 매크로가 정의되어 있으면 #ifdef M  #if defined(M) defined(M): 전처리 연산자, 매크로 M이 정의되어 있으면 참 #ifndef 매크로: 매크로가 정의되어 있지 않으면 #ifndef M  #if !defined(M) #else: 그렇지 않으면 #elif 조건: 그렇지 않고 조건이 참이면 (else if) #endif: 조건부 컴파일 지시자 끝 #if / #ifdef / #ifndef … #endif

조건부 컴파일 지시자 예 #if DEBUG_LEVEL >= 1 printf("result = %d\n", result); #endif #ifdef LINUX ... // LINUX 버전인 경우 #else ... // LINUX 버전이 아닌 경우 #endif #if NATION == 1 #include "korea.h" #elif NATION == 2 #include "china.h" #else #include "usa.h" #endif #ifndef LIMIT // LIMIT이 정의되어 있지 않으면 # define LIMIT 1000 #endif #if 0 // 전처리 기능을 이용한 주석 처리 … #endif

예제 #include <stdio.h> #define DELUXE int main(void) { #ifdef DELUXE printf("딜럭스 버전입니다.\n"); #endif return 0; } 딜럭스 버전입니다.

조건부 컴파일 지시자 #if VERSION > 3 // 가능! 버전이 3보다 크면 #if (AUTHOR == KIM) // 가능! KIM은 매크로 #if (VERSION * 10 > 500 && LEVEL == BASIC) // 가능! #if (VERSION > 3.0) // 오류! 실수는 허용되지 않음 #if (AUTHOR == "CHULSOO") // 오류! 문자열은 허용되지 않음 #if (VERSION > 300 || defined(DELUXE)) // 가능!

#include #include <…> 표준 디렉토리(폴더)에서 파일 탐색 #include "…" 현재 디렉토리에서 파일 탐색  표준 디렉토리에서 파일 탐색 (현재 디렉토리에 없는 경우) 경로 지정 가능 #include "graphic/point.h" #include "D:\Project\source\point.h" #include "/home/user1/source/point.h"

헤더 파일 중복 포함 방지 // rect.h #ifndef RECT_H #define RECT_H // rect.h struct rect { int x, y, w, h; }; … #endif // rect.h struct rect { int x, y, w, h; }; … // shape.h #include "rect.h" … // shape.h #ifndef SHAPE_H #define SHAPE_H #include "rect.h" … #endif // main.c #include <stdio.h> #include "rect.h" #include "shape.h" …

다중 소스 파일 단일 소스 파일 다중 소스 파일 소스의 재사용과 관리가 어려움 일부만 수정한 경우에도 전체를 다시 컴파일해야 함 다중 소스 파일 모듈별로 별도의 소스 파일 유지  소스의 재사용과 관리가 용이함 변경된 소스 파일만 다시 컴파일  컴파일 시간 단축

다중 소스 파일 라이브러리

예제 power.h main.c #ifndef POWER_H #define POWER_H double power(int x, int y); #endif #include <stdio.h> #include "power.h" int main(void) { int x,y; printf("x의 값을 입력하시오: "); scanf("%d", &x); printf("y의 값을 입력하시오: "); scanf("%d", &y); printf("%d의 %d 제곱값은 %f\n", x, y, power(x, y)); return 0; } power.c #include "power.h" double power(int x, int y) { double result = 1.0; int i; for (i = 0;i < y; i++) result *= x; return result; } x의 값을 입력하시오: 2 y의 값을 입력하시오: 3 2의 3 제곱값은 8.000000

헤더 파일을 사용하지 않으면 함수 원형 선언 반복

헤더 파일을 사용하면 헤더 파일 포함

다중 소스 파일에서 외부 변수

비트 필드 int/unsigned 타입의 구조체 필드는 비트 단위로 크기 지정 가능  비트 필드 메모리 절약 struct product { unsigned style : 1; // [0, 1] unsigned size : 2; // [0, 3] int value : 5; // [-16, +15] }; int/unsigned (word) value size style

예제 ? … 1 #include <stdio.h> struct product { unsigned style : 1; unsigned size : 2; int value : 5; }; int main(void) { struct product p; p.style = 1; p.size = 2; p.value = -10; printf("style = %u, size = %u, value = %d\n", p.style, p.size, p.value); printf("sizeof p = %d\n", sizeof p); printf("p = %08X\n", p); return 0; } style = 1, size = 2, value = -10 sizeof p = 4 p = 000000B5 ? … 1 value size style

비트 필드 code struct product { int code; // 일반 멤버 unsigned style : 1; unsigned size : 2; int value : 5; unsigned : 0; // 현재 워드의 나머지 비트는 사용하지 않음 unsigned state : 4; // 다음 워드에 할당 }; code value size style state