print.c 파일
#include <stdio.h>
void print()
{
printf("print.c\n");
}
main.c파일
#include <stdio.h>
static void print()
{
printf("main.c\n");
}
int main()
{
print();
return 0;
}
-------------------------------------------------------------
여기서 컴파일 후 실행을 해보면 "main.c"가 출력이 됩니다.
그런데
#include <stdio.h>
static void print()
{
printf("main.c\n");
}
extern void print();
int main()
{
print();
return 0;
}
위처럼 main.c파일의 main함수 바깥에 extern void print();를 입력을 해도 "print.c"는 안나오고 "main.c"만 출력이 되는데 왜 그런건가요?
같은 함수명이면 extern키워드보다 static키워드가 더 우선인가요??
컴파일 에러는 왜 안나는건가요?
(그런데 extern void print(); 코드를 static void print(); 위로 옮기면 컴파일에러가 생깁니다.)
저 상태에서 "print.c"를 굳이 출력하고 싶으면 함수명을 print가 아닌 다른걸로 바꿔줘야 하는수밖에 없나요?
같은 함수 이름에는 extern과 static을 함께 쓸 수 없습니다. 둘 중에 하나만 써야 합니다.
static은 내부 연결(internal linkage)로 범위를 한정한다는 뜻입니다. 조금 복잡한 얘기지만, 이 파일 안에서만 함수를 찾으라는 뜻입니다.
extern은 외부 연결(external linkage)까지 범위를 확장한다는 뜻입니다. 다른 파일에서도 함수를 찾으라는 뜻입니다.
둘 중에 하나만 선택해야 합니다. 쉽게 말해 "군필 여고생"은 성립할 것 같지만, "군필"이거나 "여고생"이거나 둘 중에 하나만 선택해야 하는 상황과 같습니다. "군필 여고생"이라는 표현을 쓸 수 있다고 해서 이게 실존하는 것은 아닌 것과 같습니다.