기억 부류 전역  지역  정적  레지스터 
 지정자  extern auto  static  register 
 저장 장소 정적 데이터 영역 스택  정적 데이터 영역  cpu의 레지스터 
 선언 위치 함수의 외부  함수의 내부  함수의 내부  함수의 내부 
 통용 범위 프로그램 전체 함수의 내부  함수의 내부  함수의 내부 
 파괴 시기 프로그램 종료시 함수 종료시 프로그램 종료시  함수 종료시 
 초기값 0으로 초기화 초기화되지 않음 0으로 초기화 초기화되지 않음 

외부변수 예제 (extern)
#include <Turboc.h>

int before = 11;

void main()
{
	extern int before;
	extern int after;

	printf("befere=%d, after=%d\n", before, after);
}

int after = 22;

main 안에 extern을 선언하여 before, after가 함수 바깥의 어딘가에 선언되어 있다고 알게된다
extern은 생략이 가능하다. 결국 같은 모듈 안에서는 별로 쓸모가 없다.

extern이 꼭 필요한 경우는 전역변수가 다른 외부 모듈에 선언되어 있을 때이다.

 #include <Turboc.h>

void main()
{
      printf("value is %d\n", value);
}
int value = 1234;




 extern.cpp  global.cpp

extern.cpp가 컴파일 될 때 어디인가 선언되어 있다고 알려준다.
1.값에 의한 호출 (call by value)

#include "Turboc.h"

int plusone(int a);

void main()
{
	int i,j;

	i=5;
	j=plusone(i);
	printf("i=%d, 결과=%d\n", i,j);
}

int plusone(int a)
{
	a=a+1;
	return a;
}

i=5 결과=6

2.참조 호출 (call by reference)

#include "Turboc.h"

void plusref(int *a);

void main()
{
	int i; 
	i=5;
	plusref(&i);
	printf("결과=%d\n",i);
}

void plusref(int *a)
{
	*a = *a + 1;
}
a의 승을 구하는 함수
power(2,10) == 1024
표준함수의 원형을 미리 작성해 놓은 것을 헤더파일이라고 한다. 대표적인 것이 stdio.h

 헤더파일  함수  예
 stdio.h  표준입출력에 관한 함수  printf, scanf, puts
 conio.h  키보드 및 화면 입출력 함수  getch, cprintf, kbhit
 stdib.h  자료 변환 함수들  atoi, itoa, malloc, free
 math.h  수학 함수들  sin, cos, log
 string.h  문자열 조작 함수들  strcpy, strlen

모듈 프로젝트 소스를 여러개 나눠서 헤더파일을 통해서 각각의 기능을 합칠 수 있다.


Game.cpp는 헤더파일을 포함으로써 개별적으로 컴파일 되어 링커에 의해 하나의 실행 파일로 합쳐진다.
함수의 원형은 과연 무엇일까? 그보다  프로그래밍 언어 해석 방식을 알아야 한다.

컴파일방식 : 실행 전 소스를 읽어 기계어로 한꺼번에 번역
인터프리터방식 : 실행하면서 기계어로 번역 

컴파일 방식은 소스를 차례대로 읽어가는 방식이다. C언어도 컴파일 방식임

main 
함수

이런 방식으로 선언하였을 경우 main에서 함수를 실행시 에러가 난다.

함수 
main  

할 경우 에러가 나지 않는다. 

이런 경우를 대비해 함수의 원형을 미리 선언해 둘 수 있다. 

#include "Turboc.h"

int Max(int a, int b);

void main(){
	
	int a, b, m;

	printf("두 수를 입력하세요 : ");
	scanf("%d%d", &a,&b);
	m=Max(a,b);
	printf("두 수 중 큰 값은 %d입니다.\n", m);
}

int Max(int a, int b)
{
	if(a > b){
		return a;
	}else{
		return b;
	}
}
#include "Turboc.h"

char Dec2HexChar(int d)
{
	if(d >= 16){
		return '?';
	}

	printf("%d, %d, %d\n", d , d + '0', d > 9);

	return d+'0'+(d>9)*7;
}

void main()
{
	int input;

	for(;;){
		printf("0~255사이의 수를 입력하시오(끝낼 때 -1) :");
		scanf("%d", &input);
		if(input == -1){
			break;
		}

		printf("입력한 수의 16진 표기 = %c%c\n",
			Dec2HexChar(input >>4), Dec2HexChar(input & 0xf));
	}
}
10진수를 16진수로 변환과정이다. 함수로 만들어넣고 참고한다. 앞의 비트와 뒤의 비트를 각각 넘기므로 한자리의 
16진수가 리턴된다.  그런데 d+'0'+(d>9)*7 과연 이것은 무엇일까? 생각했다. 

그러다 아스키코드 표를 보고 이해를 하게 되었다. 0은 아스키코드로 48을 나타낸다. 그래서 d로 넘어온 숫자면 그냥 더하면
 0  1  2  4  5  6
 48  49 50   51 52  53  54  55  56  57 

이렇게 순서대로 보여지게 된다. 

그렇다면 (d>9)*7은 무엇일까. 아스키코드 57 즉 9 이후에는 특수문자가 7개 이후에 
 A B
65   66 67   68 69   70  71  72 73  74 

즉 9이상 클경우에는 영어로 표현되기 때문에 9이하는 0*7이 되서 아무것도 안 되지만 9 이상일경우 7을 더해 영어를 표현하였다. 


+ Recent posts