오늘 함수포인터를 공부하던 중 궁금한것이 하나 생겼습니다.

 

문제의 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
void c(int a, int b, int (*c)(int,int))
{
    printf("%d",c(a,b));
}
int add(int a, int b)
{
    return a+b;
}
void main()
{
    c(5,10,add);
}
cs

문제의 소스코드 결과

1
 15
cs

 

함수c와 지역변수c를 어떻게 구분하냐는 것이죠. [처음에는 이름이 똑같아서 오류가 날 줄 알았습니다.] 코드를 보면 void c대신에 인자값으로 들어온 함수포인터 c가 실행되게 됩니다.

 

이것에 대한 답을 실험이랑 구글링을 해서 찾아보니 [함수명, 전역변수, 문자열상수]랑 [지역변수]의 이름이 같을때는 지역변수가 우선적으로 실행된다는것을 알았습니다.

 

그렇다면 지역변수와 전역변수가 같이있을때 전역변수를 사용하고 싶다면 어떻게 해야 할까요? 바로 extern 을 이용하는 겁니다.

 

extern은 두가지 방식으로 사용됩니다.

- 다른 파일에  선언된 변수를 가져올 때

- 블록외부에 선언된 변수를 가져올 때

[static 전역변수와 같은 경우는 extern이 작동을 안합니다. 왜냐하면 정적 전역 변수는 자신이 선언된 소스파일 안에서만 사용할 수 있기 때문이죠.]

[추가로 아래의 소스코드에서 전역변수가 static으로 바껴도 실행이 안되는데 같은파일인데도 실행이 안되는 이유는 블록외부에서 선언된 변수를 가져오는 용도로 사용했기 때문에 static의 범위가 파일에서 블록으로 줄어들었기 때문입니다.(추측) ]

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int a=10;
int main()
{
    int a=5;
    {
        extern int a;
        printf("%d\n",a);
    }
    printf("%d",a);
}
cs

결과

1
2
10
5
cs

 

지역변수a로 인해 전역변수 a를 인식을 못하기 때문에 extern을 이용해 블록외부에 있는 전역변수 a를 불러와 줍니다.

중괄호의 역할은 블럭입니다. 변수의 영역을 나눠 주는것이죠. 그러면 똑같은 이름으로 변수를 사용할 수 있습니다. 만약 중괄호를 안쓸경우 중복된 a선언이라는 오류를 보실 수 있습니다.

 

 

'『프로그래밍』 > C' 카테고리의 다른 글

printf함수 구현해보기  (0) 2017.12.29
뱀게임  (1) 2017.12.27
조건부 컴파일  (0) 2017.12.20

+ Recent posts