c 에서 extern 사용하는데 궁금한점이 있어서 글남깁니다.

kins575의 이미지


function.c

#include<stdio.h>
int 
print_num(int a, int b, int c)
{
    printf("%d, %d, %d\n", a, b ,c);
    return 0;
}
 
void 
main()
{   
    print_num(1, 2, 3);
}  

main.c

extern print_num(int a, int b, int c); 
 
int
main()
{
    print_num(2,3,4);
}

이런식으로 짜고

gcc -c *.c
gcc -o main *.o

이렇게 컴파일을 하는데
main이 두번있다고 컴파일 에러가 나네요

extern 으로 선언한 print_num(int a, int b, int c); 이 함수만 링크 되는것이 아니라
function.o 파일 자체가 링크 되는 것인가요?

shint의 이미지

main() 위에 정의'해주셔야 합니다.

헤더가 파일로 분리된 경우에는 선언'해주셔야 합니다.

클래스도 같습니다.

그냥. 함수 위에 사용할 내용을 적으시는것이 포인트.

func.obj (func.cpp + func.h) + main.obj (main.cpp + func.h) ---> main.ilk ---> main.exe

//-------------------
//func.h
//-------------------
int print_num(int a);   //선언
 
 
 
//-------------------
//func.cpp
//-------------------
#include "func.h"
 
int print_num(int a)   //정의
{
	printf("%d\n", a);
	return 0;
}
 
 
//-------------------
//main.cpp
//-------------------
#include "func.h"        //int print_num(int a);   //선언
 
int main()
{
	print_num(10);   //실행
    return 0;
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

kins575의 이미지

제가 궁금한 점은 extern 으로 main이 있는 다른 소스에서 함수를 불러와서 쓸 수 있는가 해써 질문드렸습니다 .ㅠㅠㅠ

익명 사용자의 이미지

안됩니다. -_-;

번거롭지만 function.c의 main함수가 컴파일되지 않게 할 방법을 찾아야 합니다. (매크로를 이용한 조건부 컴파일 등)
이런 식으로 말이죠.

#include<stdio.h>
int 
print_num(int a, int b, int c)
{
    printf("%d, %d, %d\n", a, b ,c);
    return 0;
}
 
#ifndef NO_MAIN
void 
main()
{   
    print_num(1, 2, 3);
}
#endif