2012-07-22 4 views
3

나는이 다음 3 개 개의 파일 (* 1 개 통화 당 2 * .HPP) :C++에서 다른 헤더 파일에서 함수를 호출하는 방법은 무엇입니까?

주 프로그램 파일 :

// test.cpp 

#include<iostream> 
#include"first_func.hpp" 
#include"sec_func.hpp" 

int main() 
{ 
    double x; 
    x = 2.3; 
    std::cout << sec_func(x) << std::endl; 
} 

- first_func.hpp 헤더 :

// first_func.hpp 

... 

double first_func(double x, y, x) 
{ 

    return x + y + x; 
} 

- sec_func.hpp 헤더 :

// sec_func.hpp 

... 

double sec_func(double x) 
{ 
     double a, b, c; 
     a = 3.4; 
     b = 3.3; 
     c = 2.5; 

     return first_func(a,b,c) + x; 
} 

sec_func.hpp 파일에서 first_func를 올바르게 호출하려면 어떻게합니까?

+2

머리글에 함수를 구현하고 있습니까? 그렇다면 나쁜 것입니다. 헤더에 함수 선언을 넣고'.cpp' 파일로 구현하십시오. 함수를 사용하고자하는 곳에 헤더를 포함시키고 모든 ** 원본 파일을 빌드하는 것을 잊지 마십시오. 이 경우가 아니라 함수 템플릿의 경우는 아닙니다. – Mahesh

답변

4

.hpp 파일에 함수 정의를 배치하는 것은 좋지 않습니다. 함수 프로토 타입 만 배치해야합니다. 이처럼 :

first_func.hpp :

double first_func(double x, double y, double x); 

first_func.cpp :

double first_func(double x, double y, double x) 
{ 
    return x + y + x; 
} 

초 FUNC의 동일.

그리고 first_func으로 전화를 걸려면 first_func.hpp을 해당 cpp 모듈에 포함시키고 호출을 작성하십시오.

따라서 모든 모듈은 모든 선언이있는 hpp과 정의가있는 cpp (즉, 본문)으로 구성됩니다. 이 모듈에서 무엇인가를 참조해야 할 때, 그것의 hpp을 포함하고 (상수, 변수, 함수, 무엇이든간에) 이름을 사용하십시오.

그리고 당신이 모든 것을 함께 연결해야합니다 :

gcc main.cpp first_func.cpp second_func.cpp -o program 
+0

왜 downvotes? – steffen

+0

그 밖의 가장 순수한 설명이 아니십니까? ;) – spacediver

+0

헤더 파일에 함수 정의를 배치하는 것은 때로는 특히 인라인해야하는 작은 함수 인 경우에 적합합니다. 함수 서명이 C++로 유효하지 않습니다. 번역 단위 *의 개념을 설명해야합니다. 다른 답변은 훨씬 더 좋으며 아마 downvotes를 유발합니다. – pmr

4

는 헤더에 함수를 정의하려면, 당신은 inline 여러 정의를 방지하기 위해 표시해야합니다.

구현을 별도의 파일로 분리하는 대신 이것을 수행하려면 함수를 호출하기 전에 프로토 타입을 제공해야합니다 (머리말 포함 (선호) 또는 직접 함수 선언).

// sec_func.hpp 

#include "first_func.hpp" 
//or 
double first_func(double x, y, x); //declaration 

double sec_func(double x) 
{ 
     double a, b, c; 
     a = 3.4; 
     b = 3.3; 
     c = 2.5; 

     return first_func(a,b,c) + x; 
} 
+0

올바른 헤더를 포함하는 대신 '직접 함수를 선언하는'것이 좋습니다. – spacediver

+0

@spacediver 방금 두 가지 대안을 나열했습니다. 헤더도 포함하는 것이 좋습니다. –

6

대부분의 기능은 구현이 컴파일 부에 있어야 그 자체로 컴파일 한번 컴파일하려고하는 파일이다.

헤더는 그 자체로 컴파일되지 말고 * 대신 여러 개의 컴파일 단위에 포함됩니다.

그래서 함수 정의가 헤더가 아닌 컴파일 단위 (.cpp 등)에 있어야합니다. 헤더는 다른 컴파일 단위가 호출하는 방법을 알 수 있도록 선언문 만 포함해야합니다 (예 : 본문 없음).


완전성을 위해, 일반적으로 (예외로) 헤더에서 정의 될 필요가있는 기능은 다음

  • inline 기능
  • 템플릿 함수 ** (클래스도)

각주 :

* 헤더는 실제로 미리 컴파일 될 수 있지만 컴파일 속도를 높이는 솔루션이며 목적을 변경하지 않습니다. 그것으로 혼란스러워하지 마라.
** 명시 적 템플릿 인스턴스화를 사용하는 경우 템플릿 함수 정의를 헤더 외부에 둘 수 있지만 이는 드문 경우입니다. 요점은 템플릿을 인스턴스화 (인자를 적용) 할 필요가있는 모든 컴파일 유닛이 완전한 정의를 가져야한다는 것입니다. 그래서 템플릿 함수 정의가 헤더에도 들어갑니다.

관련 문제