반응형
출처: http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=61+4XczcSTtNeRadtEceQZxhRcPh2Atk&qb=ZXh0ZXJu&enc=utf8&section=kin&rank=3&sort=0&spq=0&pid=fCxq4doi5Uhssc/OgL4sss--095497&sid=SkwNzXfqS0oAAHNLNFs

- 프로그래머의 [적] 전역변수 -

 

안녕하세요.. extern에 대해 고민이 많으시군요..

한때, 저도 고민 많이 햇답니다.. extern << 이넘의 실체는?

전 이렇게 분류 하고 싶네요..

1. static 변수... 즉

void main 위에 위치하는 넘까지 포함해서..

  -- 전.역.변.수 -- 라고 부르고 싶네요..

2. 지역변수

{   } 안에 위치한넘... ( ) 포함해서.

 -- 지.역.변.수 라고 부르고 싶네요.

3. 광역변수

모든 프로젝트에 위치한넘.

 

 

전역변수는 에서는 선언된 이후라면 어디든 사용이 가능하죠..

하지만.. .h니 .c 니 이렇게 여러 프로젝트 단위로 나뉘어진 변수라면..

상.당.히 골치 아픕니다...

 

먼저 컴파일러가 되어서 생각 해보죠..

------- 1.c

int a;   // a가 선언 되어있네?

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

-------- 2.c

// 새로 컴파일을 시작하네?

int sam()

{

   a = 10;  // 아자.. 이건 어디서 굴러먹다온 뼉다그야.. ㅡㅡ 젝힐.....

}

// 몰라 배째 error

 

그럼 광역변수는 어케 되는걸까 잠시 보죠..

위의 예를 가지고 하죠

 

프로그래머 : 난 a를 광역으로 쓰고 싶다그.....

PC : 그럼 광역으로 쓴다는 걸 알려줘 어느넘인지 모르겠어..

프로그래머 : 알따 헤더파일을 만드러주지 ㅡㅡ

 

------------ 1.h
extern int a;  // a너는 누구라도 쓸수 있는거야~~ 앙?

 

------- 1.c

#include "1.h"

int a;   // a가 선언 되어있네? 메모리에 공간을 잡자..

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

 

 

-------- 2.c

#include "1.h"

// 새로 컴파일을 시작하네?

int sam()

{

   a = 20;  // 어라?  a가.. 전체적으로 사용하네.. (메모리 공간이 잡혀있나?) 오.. 잡혀있다.

}

// 좋아 굳굳굳...

 

------------ 즉 extern 선언은 컴파일러가 알아 듣기 위한 최소한의 요구 사항입니다.

아니면, 해당 변수를 찾을수가 없어서. 난리 치는거죠.. ㅠㅠ

이보다.. 간결한 방법은.. ^^;;;;;;; 쓰지 않고 지역 변수를 사용 하는 방법 입니다만...

 

모바일 프로그램 같은.. 속도를 요하는 프로그래밍에서는 변수를 지역으로 잡아서 새로이 생성 하는데 리스크가 너무 크다고 생각합니다.

int sam()  // 100번만 호출되도

{

   int a;  // 100번 생성해야하니 원~!!!

}

그래서 어쩔수 없이 전역 혹은 광역변수를 사용 하지요..

 

또한,, 모바일 OS 포팅 같이 꽤 방대한 분량의 코드에서는 전역변수 저넘이 어느 타이밍에서 어떤 값으로 변환되는지 알기가 쉽지 않아서.. 분담코드 작성에는 매.우. 비효율적입니다...

----------

아.. 이 난관을 어케 해야하노 ㅠㅠ.....

'language > C' 카테고리의 다른 글

int vs char 차이  (0) 2011.07.07
warning - array subscript has type `char'  (0) 2010.01.06
BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
반응형
10진수 111을 BCD로 저장할 때는 그냥 16진수 111으로 저장


'language > C' 카테고리의 다른 글

warning - array subscript has type `char'  (0) 2010.01.06
extern  (0) 2009.07.02
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
반응형

'language > C' 카테고리의 다른 글

extern  (0) 2009.07.02
BCD(binary Coded Decimal)  (0) 2009.06.23
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
#define와 const 차이점  (1) 2009.05.05
반응형

for( i = 0 ; i < 7 ; ++i )

{   

    if( i == 3 )     continue;

    if( i == 5 )     break;

    printf( "%d\n", i )

}

 

i = 0 : 0 출력

i = 1 : 1 출력

i = 2 : 2 출력

i = 3 : continue를 수행하므로, 출력없이 가장 위로 올라가서 ++i에 의해 1이 증가

i = 4 : 4 출력

i = 5 : break를 수행하므로, for 문 탈출

 

그래서 결과적으로 출력은

0

1

2

4

 

'language > C' 카테고리의 다른 글

BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
const와 static  (0) 2009.05.05
#define와 const 차이점  (1) 2009.05.05
#ifdef와 defined() 차이점  (0) 2009.05.05
반응형

질문자 인사 좋은 답변 감사합니다. 많은 도움이 되었습니다.

const - [기본적으로] 무엇이든 상수화 시켜준다!  

int ar[5]={1,2,3,4,5};

 

const int *ptr=&ar[0]; //int를 고정(값 변경 불가 주소 변경 가능)
pi2++;                // 포인터가 다른 대상체를 가리킬 수 있다.
*pi2=0;               // 에러 : 대상체가 상수이므로 값을 변경할 수 없다.
 
int * const ptr=&ar[0];//ptr(포인터)를 고정(값 변경 가능. 주소 변경 불가)
pi3++;                // 에러 : 포인터가 다른 대상체를 가리킬 수 없다.
*pi3=0;               // 대상체의 값을 변경할 수 있다.
 
const int * const ptr=&ar[0];//int와 ptr을 고정(값 변경 불가 주소 변경 불가)
pi4++;                // 에러 : 포인터가 다른 대상체를 가리킬 수 없다.
*pi4=0;               // 에러 : 대상체가 상수이므로 변경할 수 없다.

 

 

[ 요약, 정리]

1. const는 자신의 오른쪽 것에 적용된다.

2. 오른쪽에 적용대상이 없으면 왼쪽에 적용한다.

 

여기서 말하는 적용대상이란 * 또는 형(type)임.

 

 

------------------------------------------------------------------------------

 

2) static (정적변수)

 

    - 블럭 안에서만 유효한 값을 가지지만 자동변수와 같이 없어지지 않고 블럭으로 다시

      돌아왔을 때 이전 값을 다시 이용 가능

    - 초기화를 생략하면 0으로 자동 초기화

    - 힙(Heap)에 메모리 할당

    - 선언된 위치에 따라 다음과 같이 구분됨

        . 내부정적변수 : 함수 내부에서 선언되며, 함수 내부에서만 사용이 가능. 하지만,

                                       프로그램이 실행되는 동안 존재

        . 외부정적변수 : 함수 외부에서 선언되며, 다른 소스파일에서는 참조할 수 없음

 

== 정리하면

 

static은 함수 또는 파일에서 값을 보존할 필요가 있을 때(예를 들어 어떤 함수를 몇 번 호출했는지 알고 싶을 때 static 변수로 하나 선언해서 호출될 때마다 1씩 더해주면 Counter를 쉽게 만들 수 있습니다) 사용됨.

: 내 블러그 ㅋㅋㅋ

의견 1

'language > C' 카테고리의 다른 글

BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
#define와 const 차이점  (1) 2009.05.05
#ifdef와 defined() 차이점  (0) 2009.05.05
반응형

'language > C' 카테고리의 다른 글

BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
#ifdef와 defined() 차이점  (0) 2009.05.05
반응형

#ifdef 는 정의되있는지를 테스트 하므로, 한번에 여러개를

사용할 수는 없다. 형식이 #ifdef name 처럼,

하나의 토큰이 되어야한다.

여러개가 정의되있는지 테스트 하기위해서는
#if defined(MACRO1) || defined(MACRO2)처럼 사용.

단, #if는 ||로 중첩해서 사용할 수 있다.
형식이, #if expression이므로, C표현이 올수 있다.

#if MACRO1 || MACRO2 처럼 사용해도 된다.

 #if !defined() 의 의미는 #ifndef 와 같다. (if not define)

()안의 내용이 정의되어 있지 않으면 그 아래부분 (#endif까지)을 유효한 소스코드로 인식하고 컴파일 시 적용하라는 의미다.

 그런데 그 괄호안의 부분을 찾을 수가 없다는 것은

EXCLUDE_PGX_SUPPORT 가 아무데도 define되지 않았음을 의미

 정의되어 있지 않으므로 해당 구문 이후의 소스코드는

유효한 코드가 된다.

 #if !defined(...)

 안의 내용은 유효코드

 #endif

 반대로, #ifdef (...)라면

해당 키워드가 정의되어 있지 않으므로

#endif  까지의 코드내용은 전부 무의미해진다.


'language > C' 카테고리의 다른 글

BCD(binary Coded Decimal)  (0) 2009.06.23
gcc설치하여 vim으로 편집하기  (0) 2009.05.19
continue 와 break 차이  (0) 2009.05.13
const와 static  (0) 2009.05.05
#define와 const 차이점  (1) 2009.05.05

+ Recent posts