
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77


목차
1. C의 개요
2. C 프로그램 제어문의 기초
3. C 프로그램 제어문
4. 자료형, 변수, 식
5. 배열과 문자열
6. 포인터
7. 함수
8. 콘솔 입출력
9. 화일 입출력
10. 구조체와 공용체
11. 그밖의 자료형과 연산자
12. C선행 처리와 고급 문제
2. C 프로그램 제어문의 기초
3. C 프로그램 제어문
4. 자료형, 변수, 식
5. 배열과 문자열
6. 포인터
7. 함수
8. 콘솔 입출력
9. 화일 입출력
10. 구조체와 공용체
11. 그밖의 자료형과 연산자
12. C선행 처리와 고급 문제
본문내용
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?
= += -= *= /= 등
가장 낮음 ,
12. C선행 처리와 고급 문제
C 선행처리기, 함수 포인터, C의 동적 할당 시스템에 관하여 알아본다. 이러한 기능들은 큰 프로그램이나 복잡한 시스템을 관리하는데 사용되므로, 여기서는 형식과 의미와 간단한 사용법만을 알아본다.
12.1 #define과 #include
#define의 확장 기능:
함수의 사용과 유사하게 인수를 #define에 정의된 매크로에게 전달할 수 있다.
예.
#include
#define SUM(i, j) i+j
void main(void)
{
int sum;
sum = SUM(10, 20);
printf(%d, sum);
return 0;
}
sum = SUM(10,20); 은 선행처리기에 의해 sum = 10+20;으로 변환된다.
매크로는 컴파일시에 호출되는 위치에 정의된 매크로가 그대로 대치되며,
함수는 실행시에 함수 내의 명령어들이 실행된다.
#include의 사용:
#include ==> 화일을 헤더 화일을 포함하고 있는 디렉토리에서 찾는다.
#include "filename" ==> 화일을 작업 디렉토리에서 먼저 찾는다. 만약 없다면
헤더 화일을 포함하는 디렉토리에서 찾는다.
12.2 조건 컴파일
프로그램 코드의 일부를 선택적으로 컴파일하는 것으로, 선행처리지시자를 사용한다.
#if 지시자
형식:
#if constant-expression
statement-sequence-1
#else
statement-sequence-2
#endif
의미:
constant-expression이 참이면 statement-sequence-1 만이 컴파일되고,
거짓이면 statement-sequence-2 만이 컴파일된다.
** #else statement-sequence2를 생략할 수 있다.
#elif 지시자
형식:
#if constant-expression-1
statement-sequence
#elif constant-expression-2
statement-sequence
#elif constant-expression-3
statement-sequence
:
#endif
의미: if-else-if 사다리 구조를 만든다.
#ifdef 지시자
형식:
#ifdef macro-name
statement-sequence
#endif
의미:
macro-name이 현재 정의되어 있으면 statement-sequence를 컴파일하고,
정의되어 있지 않으면 컴파일하지 않는다.
#ifndef: ifdef와 반대로 작동한다.
12.3 #error, #undef, #line, #pragma
특수 지시자로 자주 사용되지는 않는다.
#error 지시자
형식: #error error-message
의미: 컴파일을 중지하고 시스템에서 결정된 정보와 함께 에러 메세지를 발생하게 한다.
주로 컴파일 에러를 찾기 위해 사용한다.
#undef 지시자
형식: #undef macro-name
의미: 이미 정의되어 있는 매크로를 해제한다.
#line 지시자
형식: #line line-num "filename"
의미: 컴파일러가 가진 줄 번호와 화일 이름을 변경한다.
#pragma 지시자
형식: #pragma instructions
의미: 다른 선행처리기 명령을 정의한다.
12.4 C의 내장된 매크로
미리 정해진 매크로 이름들:
__LINE__ : 현재 컴파일되고 있는 프로그램의 줄 번호를 포함한다.
__FILE__ : 현재 컴파일되고 있는 화일 이름을 포함한다.
__DATE__ : 현재의 시스템 날짜에 해당하는 문자열을 포함한다.
month/day/year 형식
__TIME__ : 프로그램의 컴파일이 시작된 시간에 해당하는 문자열을 포함한다.
hours:minutes:seconds 형식
__STDC__ : 컴파일러가 ANSI 표준에 따른다면 1로 정의되어 있다.
12.5 #와 ## 연산자의 사용
# 지시자: 함수와 유사한 매크로 인수를 따옴표를 갖는 문자열로 만든다.
## 지시자: 두 개의 식별명을 결합시킨다.
예.
#include
#define MKSTRING(str) # str
void main(void)
{
int value;
value = 10;
printf("%s is %d", MKSTRING(value), value);
return 0;
}
12.6 함수 포인터
함수의 시작 지점의 주소값을 저장할 수 있는 변수
예. int (*p) (int a, int b) ; /* 2개의 정수형 매개변수 a와 b를 가지며 */
/* 정수를 반환하는 함수의 포인터 p를 선언한다. */
** *p 주위의 괄호는 C의 우선순위 규칙 때문에 필요하다.
함수의 포인터를 이용하여 함수를 호출할 수 있다.
예. int (*p) (int a, int b) ;
int sum (int a, int b) ;
:
p = sum ; /* p는 함수 sum의 시작 주소를 갖는다 */
result = (*p) (10, 20) ; /* p를 통하여 간접적으로 sum(10,20)을 호출한다 */
12.7 동적 할당
실행시에 필요할 때마다 기억 장소를 할당하는 것
필요한 메모리의 크기가 가변적이거나 매우 큰 경우에 사용
할당 함수: void *malloc(size_t numbytes);
numbytes: 할당하고자 하는 기억 장소의 바이트 수
이 함수는 할당된 기억 장소의 시작점에 대한 포인터를 반환하며,
할당할 수 없다면, 널(null)을 반환한다.
해제 함수: void free(void *ptr);
ptr은 해제하기를 원하는 기억 장소의 시작점에 대한 포인터이다.
예.
#include
#include
int main(void)
{
char *p;
p = malloc(80);
if(!p) {
printf("allocation failed");
exit(1);
}
printf("Enter a string: ");
gets(p);
printf(p);
free(p);
return 0;
}
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?
= += -= *= /= 등
가장 낮음 ,
12. C선행 처리와 고급 문제
C 선행처리기, 함수 포인터, C의 동적 할당 시스템에 관하여 알아본다. 이러한 기능들은 큰 프로그램이나 복잡한 시스템을 관리하는데 사용되므로, 여기서는 형식과 의미와 간단한 사용법만을 알아본다.
12.1 #define과 #include
#define의 확장 기능:
함수의 사용과 유사하게 인수를 #define에 정의된 매크로에게 전달할 수 있다.
예.
#include
#define SUM(i, j) i+j
void main(void)
{
int sum;
sum = SUM(10, 20);
printf(%d, sum);
return 0;
}
sum = SUM(10,20); 은 선행처리기에 의해 sum = 10+20;으로 변환된다.
매크로는 컴파일시에 호출되는 위치에 정의된 매크로가 그대로 대치되며,
함수는 실행시에 함수 내의 명령어들이 실행된다.
#include의 사용:
#include
#include "filename" ==> 화일을 작업 디렉토리에서 먼저 찾는다. 만약 없다면
헤더 화일을 포함하는 디렉토리에서 찾는다.
12.2 조건 컴파일
프로그램 코드의 일부를 선택적으로 컴파일하는 것으로, 선행처리지시자를 사용한다.
#if 지시자
형식:
#if constant-expression
statement-sequence-1
#else
statement-sequence-2
#endif
의미:
constant-expression이 참이면 statement-sequence-1 만이 컴파일되고,
거짓이면 statement-sequence-2 만이 컴파일된다.
** #else statement-sequence2를 생략할 수 있다.
#elif 지시자
형식:
#if constant-expression-1
statement-sequence
#elif constant-expression-2
statement-sequence
#elif constant-expression-3
statement-sequence
:
#endif
의미: if-else-if 사다리 구조를 만든다.
#ifdef 지시자
형식:
#ifdef macro-name
statement-sequence
#endif
의미:
macro-name이 현재 정의되어 있으면 statement-sequence를 컴파일하고,
정의되어 있지 않으면 컴파일하지 않는다.
#ifndef: ifdef와 반대로 작동한다.
12.3 #error, #undef, #line, #pragma
특수 지시자로 자주 사용되지는 않는다.
#error 지시자
형식: #error error-message
의미: 컴파일을 중지하고 시스템에서 결정된 정보와 함께 에러 메세지를 발생하게 한다.
주로 컴파일 에러를 찾기 위해 사용한다.
#undef 지시자
형식: #undef macro-name
의미: 이미 정의되어 있는 매크로를 해제한다.
#line 지시자
형식: #line line-num "filename"
의미: 컴파일러가 가진 줄 번호와 화일 이름을 변경한다.
#pragma 지시자
형식: #pragma instructions
의미: 다른 선행처리기 명령을 정의한다.
12.4 C의 내장된 매크로
미리 정해진 매크로 이름들:
__LINE__ : 현재 컴파일되고 있는 프로그램의 줄 번호를 포함한다.
__FILE__ : 현재 컴파일되고 있는 화일 이름을 포함한다.
__DATE__ : 현재의 시스템 날짜에 해당하는 문자열을 포함한다.
month/day/year 형식
__TIME__ : 프로그램의 컴파일이 시작된 시간에 해당하는 문자열을 포함한다.
hours:minutes:seconds 형식
__STDC__ : 컴파일러가 ANSI 표준에 따른다면 1로 정의되어 있다.
12.5 #와 ## 연산자의 사용
# 지시자: 함수와 유사한 매크로 인수를 따옴표를 갖는 문자열로 만든다.
## 지시자: 두 개의 식별명을 결합시킨다.
예.
#include
#define MKSTRING(str) # str
void main(void)
{
int value;
value = 10;
printf("%s is %d", MKSTRING(value), value);
return 0;
}
12.6 함수 포인터
함수의 시작 지점의 주소값을 저장할 수 있는 변수
예. int (*p) (int a, int b) ; /* 2개의 정수형 매개변수 a와 b를 가지며 */
/* 정수를 반환하는 함수의 포인터 p를 선언한다. */
** *p 주위의 괄호는 C의 우선순위 규칙 때문에 필요하다.
함수의 포인터를 이용하여 함수를 호출할 수 있다.
예. int (*p) (int a, int b) ;
int sum (int a, int b) ;
:
p = sum ; /* p는 함수 sum의 시작 주소를 갖는다 */
result = (*p) (10, 20) ; /* p를 통하여 간접적으로 sum(10,20)을 호출한다 */
12.7 동적 할당
실행시에 필요할 때마다 기억 장소를 할당하는 것
필요한 메모리의 크기가 가변적이거나 매우 큰 경우에 사용
할당 함수: void *malloc(size_t numbytes);
numbytes: 할당하고자 하는 기억 장소의 바이트 수
이 함수는 할당된 기억 장소의 시작점에 대한 포인터를 반환하며,
할당할 수 없다면, 널(null)을 반환한다.
해제 함수: void free(void *ptr);
ptr은 해제하기를 원하는 기억 장소의 시작점에 대한 포인터이다.
예.
#include
#include
int main(void)
{
char *p;
p = malloc(80);
if(!p) {
printf("allocation failed");
exit(1);
}
printf("Enter a string: ");
gets(p);
printf(p);
free(p);
return 0;
}
추천자료
c로배우는알고리즘에서 ROBOT프로그램을 C언어로 바꾸자.
C언어 야구 게임
C언어를 이용해 하노이탑 구현 프로그램
C언어를 이용한 분수의 덧셈과 곱셈을 하는 프로그램
C언어를 이용해 문자열을 추출하는 프로그램
C언어를 이용한 야구게임(숫자맞추기) 프로그램
C언어를 이용한 성적처리(성적관리) 프로그램
C언어를 이용한 [3][3]행렬(3*3행렬), 행렬의 덧셈과 행렬의 곱셈
C언어 처음공부하는 사람들에게 도움이 되는 코딩들(기초부터 포인터까지)
c언어로 만든 typedef 구조체 개념 프로그램
c언어 계산기
c언어로 애니메이션을 만들어 주세요
c언어에서의 포인터(pointer)
C언어express 연습문제입니다
소개글