2차원 배열 동적할당.
Programming/C 2013. 2. 15. 02:02 |'Programming > C' 카테고리의 다른 글
수학 관련 함수 (0) | 2013.02.15 |
---|---|
ftell 함수와 rewind 함수 (0) | 2013.02.15 |
fprintf와 문자열 형식 (0) | 2013.02.15 |
조건부 컴파일 (0) | 2013.02.15 |
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
수학 관련 함수 (0) | 2013.02.15 |
---|---|
ftell 함수와 rewind 함수 (0) | 2013.02.15 |
fprintf와 문자열 형식 (0) | 2013.02.15 |
조건부 컴파일 (0) | 2013.02.15 |
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
ftell 함수와 rewind 함수 (0) | 2013.02.15 |
---|---|
2차원 배열 동적할당. (2) | 2013.02.15 |
조건부 컴파일 (0) | 2013.02.15 |
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
#if, #elif, #else, #endif 를 이용한 조건부 컴파일
전처리 지시자 #if, #elif, #else, #endif 는 전처리기에게 조건을 제시하는 경우에 사용된다.
ex) #if CONDITION1
expression1
#elif CONDITION2
expression2
#else
expression3
#endif
"CONDITION1이 만족되면 expression1을, CONDITION2가 만족되면 expression2를, 이도 저도 아니면 expression2을 컴파일하라"
if~ else if 문장과 상당히 유사한 형태를 지니고 있음을 알 수 있다. 다만 위의 문장은 전처리기에 의해 처리되기 때문에
컴파일 해야 할 대상을 지정할 때 사용하게 된다.
※ #endif 는 꼭! 빼먹지 말고 넣어주어야 한다. "여기까지입니다." 라는 뜻이니!!
#ifndef, #endif 를 이용한 조건부 컴파일
ifndef == if not define(정의하지 않았다면)
: 헤더 파일을 마구마구 만들어서 포함(#include)해 가다 보면 문제가 발생하기 마련이다.
위의 코드는 count.h의 int 형 count를 중복 선언해서 일어나는 에러이다. (헤더 자체를 중복 포함하는 것이 문제가 되는 것은 아니다.)
해 결 책
첫 번째 방법
: 헤더 파일을 중복해서 포함하는 것을 막는 것이다.
└ 이것을 적용하기 위해서는 신경 쓸 일이 한둘이 아니다. 파일의 배치 자체를 바꿔야 할 수도 있다.
두 번째 방법
: 중복 포함하더라도 내부에 선언된 내용들이 한번만 선언 및 정의되게 하는 것이다.
└ 아주 간단한 처리를 통해서 적용이 가능하다. 실제로 많은 프로그래머들이 사용하는 방법이다.
● 헤더 파일의 포함 관계에서 발생하는 문제의 해결
: 조건부 컴파일은 헤더 파일을 중복 포함하더라도 내부에 선언된 내용들이 한번만 선언 및 정의되게 하는 것이다.
ex) #ifndef _COUNT_H_ → _COUNT_H_를 정의하지 않았다면
#define _COUNT_H_ → _COUNT_H_를 정의하고
int count = 0; → int형 변수 count도 선언하고
#endif → 끝낸다.
#ifndef _COUNT_H_ ~ #endif 는 다음과 같은 의미는?
: 만약에 _COUNT_H_ 를 정의하지 않았다면 컴파일 시 #endif 이전까지의 내용을 컴파일해라.
count.h헤더 파일을 이렇게 선언하면 위에 에러문제는 해결된다.
왜냐하면, 내부에 존재하는 내용은 한번만 선언 및 정의되기 때문이다.
그리고, #defile _COUNT_H_를 정의하는 목적은 오로지 조건부 컴파일을 위한 것이다.
더불어, _COUNT_H_ 는 헤더 파일 이름을 이용하여 만든 것이다. 조건부 컴파일을 위한 매크로를
정의하는 경우 어떤한 이름을 주건 상관 없지만 이름이 중복되어서는 안 될 것이다.
파일의 이름은 중복될 일이 없으므로, 이를 이용하는 것은 좋은 방법이고, 또 가장 보편화되어 있다.
지금까지의 내용을 종합해 보면 헤더 파일 선언 시 파일 내에 존재하는 모든 내용을 #ifndef와 #endif 문장으로
감싸는 것이 좋다는 결론을 내리게 된다.
언제 어떻게 중복 포함될지 모르는 일이기 때문이다.
2차원 배열 동적할당. (2) | 2013.02.15 |
---|---|
fprintf와 문자열 형식 (0) | 2013.02.15 |
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
모듈(Module)이란?
: 소프트웨어에서 말하는 모듈이란 프로그램의 일부분을 의미하는 것이다.
C언어를 이용하여 계산기에 관련된 함수들을 구현했다면, 이러한 함수들의 집합도 하나의 모듈이 될 수 있다.
※ 일반적으로 소프트웨어 공학에서 이야기하는 모듈(module)이라는 것은 크게는 하나의 파일이 될 수도 있지만,
작게는 하나의 함수가 될 수도 있다.
외부 변수의 사용: 키워드 extern (External = 외부의, 밖의)의 의미.
: ex) extern int i;
이렇게 선언을 하면, 컴파일러에게 변수 i는 외부에(다른 파일에) 선언되어 있음을 알려주는 것이다.
그래서 컴파일러는 그냥 컴파일을 한다.
※ 외부(다른 파일)에 정의된 함수를 호출하기 위해서 함수를 선언할 때 extern이라는 키워드를 반드시 써야 하는 것은 아니다.
왜냐하면, 함수 선언 자체가 extern의 의미를 포함하고 있기 때문이다.
ex) extern double add(double a, double b);
double add(double a, double b); // 이 둘은 같은 의미이다.
그러나, extern이라는 키워드를 붙여 주는 것이 나쁘지는 않다. 왜냐하면 함수의 정의가 외부에 존재한다는 의미를 부여할 수 있기 때문이다.
외부 접근 금지: 전역 변수 선언시, 키워드 static의 의미.
:전역 변수로 변수 앞에 static 선언을 하면 외부의 접근을 금지한다는 뜻이 된다.(정확히는 변수의 접근 영역을 파일로 제한한다는 뜻.)
ex) static int a; ← extern int a; 접근 불가!!!
int a; ← extern int a; 접근 가능!!!
링크(Link)에 대한 이해
: 컴파일을 하면 오브젝트 파일이 생긴다.(obj파일은 단지 기계어로 변환된 내용만을 지닌 파일이다.)
만약, 모듈화 프로그래밍을 해서 두개의 파일이 있다면 두개의 obj파일이 생성되어있을것이다.
링크는 이 파일 두개를 서로 연결시켜주는 작업을 한다. 그래서 하나의 완성된 실행 파일을 생성한다.
: 최종적인 실행 파일의 생성을 위해서 접근하는 변수가 어디에 존재하는지, 호출하는 함수가 어디에 존재하는지
연결해 주는 작업을 가리켜 링크라 한다.
헤더파일(Header File)의 구현과 유용성
: ANSI 표준에서 정의하고 있는 헤더 파일을 "표준 헤더 파일"이라 한다.
이러한 헤더 파일들을 모아놓은 곳이 "표준 디렉토리"라고 한다.
: 확장자가 .h로 끝나는 파일을 헤더 파일이라고 한다. 헤더 파일은 #include 전처리기 지시자에 의해서 다른 파일 내에 포함된다.
※ 일반적으로 함수의 정의를 헤더 파일에 포함시키지는 않는다. 선언만 헤더 파일에 포함한다.
- 헤더 파일을 포함하는 두 가지 방법 -
ex) #include <abc.h> // 표준 디렉토리에서 abc.h를 찾아서 포함.
#include "c:/include/abc.h" // c:/include 에서 abc.h를 찾아서 포함.
#include "/include/lib/plus.h" // /include/lib/plus.h에 존재하는 plus.h 포함.(유닉스 계열 컴퓨터)
◎ < >를 이용한 헤더 파일의 포함.
: 표준 디렉토리는 컴파일러마다 유지하고 있는 위치가 다르다.
: 표준 디렉토리에 존재하는 헤더 파일을 포함하기 위해서는 < >를 사용한다.
◎ " "를 이용한 헤더 파일의 포함.
: " "를 이용해서 헤더 파일을 포함할 경우 헤더 파일이 존재하는 디렉트로의 위치를 직접 지정하는 것이 가능하다.
: 보통 사용자가 정의하는 헤더 파일은 위치를 정해서 따로 관리하기 마련인데, 이렇게 임의의 위치에 존재하는
헤더 파일을 포함하는 경우, 다시 말하면 사용자가 정의하는 헤더 파일을 포함하는 경우 " "를 이용하게 된다.
※ main 함수를 지니고 있는 파일을 메인 모듈(main module)이라 한다.
여기서는 file.c라는 파일을 만들어 함수의 "정의"를 해두었다.
그리고 메인 모듈로 가선 함수의 "선언"을 해주었다.
자 그런데.. 만약 저 함수들의 인자받는 것이 바뀐다면... 이를테면 void 형으로 바뀐다면...
메인모듈의 있는 함수 원형 선언문 모두를 void로 바꾸어야 한다.
지금은 4개밖에 없지만.. 저것이 10~20개면.. 그리고 다른 파일들도 저 선언을 가지고 있다면..
파일을 돌아다니며 다 바꿔주어야 한다. 참 귀찮을 것이다.
그런데, 헤더파일을 만들어서 거기에 함수 원형을 선언하고 메인 모듈이나 다른 파일들이 #include하는 식이라면...
헤더파일에 있는 함수 선언만 바꿔주면 끝이다.
이러한 번거로운 일들을 편히 하기 위해서 헤더 파일이라는 것을 만든다.
fprintf와 문자열 형식 (0) | 2013.02.15 |
---|---|
조건부 컴파일 (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
메모리 관리와 동적 할당 (0) | 2013.02.15 |
조건부 컴파일 (0) | 2013.02.15 |
---|---|
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
메모리 관리와 동적 할당 (0) | 2013.02.15 |
파일 복사 프로그램 (0) | 2013.02.15 |
토큰(Token) 이란,
토큰이라는 단어는 사용되는 분야에 따라서 해석이 다양한데, C언어에서의 토큰이란
컴파일러가 인식하는 의미를 지니는 문자나 문자열의 최소 단위를 뜻한다.
ex) int val = a + b;
위의 문장을 최소의 단위로 나눠 보면 "int", "val", "=", "a", "+", "b", ";" 이렇게 총 7개가 된다.
따라서 총 7개의 토큰으로 구성되어 있는 문장이라 할 수 있다.
변수나 함수의 이름부터 시작해서 연산자, 키워드 및 상수들도 모두 토큰의 기본 단위가 된다.
토큰(Token)의 결합
#define TOKEN(x,y) x ## y
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
TOKEN(a,b) → ab
TOKEN("aa,"bb") → "aa""bb"
TOKEN(arr,[i]) → arr[i]
##는 토큰을 결합할 때 사용된다.
## 이것을 어디에서 써 먹는 것인지 아리송하다.
지금 당장 ##의 필요성을 알 필욘 없단다.. 다만 변수나 함수의 이름을 동적으로 작성하기 위한 용도로 사용된다고 한다.
모듈화 프로그래밍 (Modular Programming) (0) | 2013.02.15 |
---|---|
전처리기 (Pre-Processor) (0) | 2013.02.15 |
메모리 관리와 동적 할당 (0) | 2013.02.15 |
파일 복사 프로그램 (0) | 2013.02.15 |
Random Access 입력 및 출력: 파일 위치 지시자(File Position Indication) fseek함수 (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
---|---|
C언어에서의 Token (0) | 2013.02.15 |
파일 복사 프로그램 (0) | 2013.02.15 |
Random Access 입력 및 출력: 파일 위치 지시자(File Position Indication) fseek함수 (0) | 2013.02.15 |
파일의 끝을 확인해주는 feof함수의 활용법 (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
---|---|
메모리 관리와 동적 할당 (0) | 2013.02.15 |
Random Access 입력 및 출력: 파일 위치 지시자(File Position Indication) fseek함수 (0) | 2013.02.15 |
파일의 끝을 확인해주는 feof함수의 활용법 (0) | 2013.02.15 |
fprintf, fscanf함수를 이용한 구구단 프로그램 (0) | 2013.02.15 |