2014-02-26 1 views
0

a.cpp에 정의 된 함수를 호출하여 b.cpp에서 사용하도록 할 수 있습니까 (헤더 파일의 a.cpp 함수를 선언하지 않아도됩니다).다른 소스 파일에 공통 헤더 파일 액세스 기능이 없습니다.

+1

예, b.cpp에 함수의 프로토 타입을 넣을 수 있습니다. 하지만 왜? –

+1

죄송합니다. 사용하기 전에'b.cpp'의 함수를 * 선언 할 수 있음을 의미합니다. 분명한 질문은 "어떤 문제를 해결하려고합니까?" – juanchopanza

+0

프로토 타입을 정의 해 주셔서 감사합니다. @JeremyWest이 작업을 수행 할 수 있습니다. 제 스태틱 정적 템플릿을 재사용하지 말고 재사용을 제안했습니다. 호기심은 프로토 타입없이 가능합니다. – Meluha

답변

2

예, 권장하지는 않지만.

실제로 헤더의 내용은 헤더의 내용을 전처리 기가 #include 지시어를 찾는 정확한 위치의 소스 코드에 효과적으로 넣는 것입니다. 대신 include 지시문을 사용 그래서 코드를 수동으로 해당 위치에 쓸 수있는 프로그램은 동일합니다 : 헤더와

:

:

//a.h 

void foo(); 

//a.cpp 
#include "a.h" 

void foo() { 
    //do something 
} 

//b.cpp 
#include "a.h" 
void bar() { 
    foo(); 
} 

로는 동일합니다 전처리 후

//a.cpp 
void foo(); 

void foo() { 
    //do something 
} 

//b.cpp 
void foo(); 

void bar() { 
    foo(); 
} 

따라서 머리글을 생략하고 필요할 때마다 수동으로 함수를 선언 할 수 있습니다. 그러나 헤더는 프로젝트 전체에서 선언이 동일하도록 보장합니다. 예 : 당신이 매개 변수를 사용하는 foo을 변경하는 경우 :

//a.h 
void foo(int); 

지금 b.cpp에서 컴파일러는 호출 foo()가 선언과 일치하지 않음을 알려줍니다. 당신이 헤더를 생략하고 대신 수동으로 선언하고 b.cpp에서 선언을 변경하는 것을 잊지 경우에 당신이 그렇게 그에게 말했다 때문에, 컴파일러, foo의 두 가지 버전이 가정됩니다 :

//a.cpp 
void foo(int); //version 1 
void foo(int i) { 
    //do something 
} 

//b.cpp 
void foo(); //oops. forgot to change that. compiler assumes a second version 

void bar() { 
    foo(); //ok, try to call version 2... 
} 

이 컴파일, 그러나 링커는에 대해 정의되지 않은 참조 인 void foo()에 대해 알려줄 것입니다. b.obj.

+0

어떤 이유로 든 제 2 접근법을 사용해야합니다. b.cpp에서 프로토 타입을 엄격하게 정의해야합니까, 아니면 b.cpp에서 프로토 타입을 사용하지 않아도됩니까? – Meluha

+0

@SagarKotecha "프로토 타입"은 정의되지 않았습니다 *. * 선언 *입니다. * 정의 *는'a.hpp'에서 찾을 수 있습니다. 즉, 본문이있는 함수입니다. 나는 까다 롭다는 의미가 아닙니다. 그러나 적절한 용어를 사용하면 사람들은 당신이 말하는 것에 대해 더 잘 이해할 것입니다. 그리고 네, 함수를 사용하기 전에 함수를 선언해야합니다. 그러나 어떻게해야하는지 * 왜 *해야한다고 생각하는지, 즉 달성해야하는 것을 Google에 알려 주면, 헤더를 더 잘 활용하는 방법을 보여줄 수 있습니다. –

+0

영어로 불편을 끼쳐 드려 죄송합니다. "프로토 타입 정의"에 대한 선언을 의미했습니다 (잘못된 것임). – Meluha

관련 문제