오늘 함수포인터를 공부하던 중 궁금한것이 하나 생겼습니다.
문제의 소스코드
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 |