2010-05-26 2 views
9

C/C++ 질문이 있습니다. 함수 헤더를 두 번 쓰지 않고 다른 오브젝트 파일이나 프로젝트에서 함수를 재사용 할 수 있습니까? (함수를 정의하기위한 함수와 선언하기위한 함수 중 하나임)함수 헤더를 두 번 쓰지 않는 것이 좋습니다.

저는 C/C++, Delphi 및 D에 대해 많이 알지 못합니다. Delphi 또는 D에서 함수가 취하는 인수를 한 번 작성하면됩니다. 다른 프로젝트에서이 기능을 사용할 수 있습니다. 그리고 C에서 헤더 파일에 함수 선언이 필요합니다. * 다시 ??, 그렇습니까? C 소스의 헤더 파일을 만드는 훌륭한 도구가 있습니까? 하나있어,하지만 전처리 인식하지 매우 엄격하지 않습니다. 그리고 나는 다소 나빴던 매크로 기법을 사용했습니다. 나는 C/C로 프로그래밍 할 수있는 방법 ++ 같은 여기에 설명을 찾고 있어요

http://www.digitalmars.com/d/1.0/pretod.html

+1

D가이 영역에서 어떻게 작동하는지 모르겠지만 델파이에서는 다른 유닛과 프로그램에서 호출 할 루틴을 포함하는 유닛을 작성하는 경우 프로 시저와 함수 선언을 두 번 작성해야합니다 인터페이스 섹션, 구현 섹션의 실제 루틴을 다시 참조하십시오. 델파이 IDE는 이것에 대해 약간의 도움을 주지만 궁극적으로는 프로그래머가 동기화 상태를 유지해야합니다. 컴파일러는 동기화되지 않을 때 확실히 알려줍니다. 이것을 유지하는 것이 어렵지 않습니다. 코드가 무엇을 하는지를 아는 프로그래머의 일의 일부입니다. – Todd

+0

'D'는 C++보다 Java 또는 C#에 가깝습니다. – egrunin

답변

11

이럴 소스에서 헤더를 생성하는 나쁜 생각과 비실입니다.

헤더에는 기능 이름 및 매개 변수에 대한 정보 만 더 포함될 수 있습니다. 여기

은 몇 가지 예 같습니다 C++ 헤더 소스 파일이 불필요한 일 수 있음에 대한 추상적 클래스를 정의 할 수 있습니다

  • 템플릿에만 헤더 파일
  • 기본 정의 할 수 있습니다
  • 매개 변수는 클래스 정의에만 지정됩니다 (따라서 헤더 파일에 있음)

일반적으로 r 헤더를 작성한 다음 해당 소스 파일에 구현을 작성하십시오.

나는 반대로 직감적이며, C 또는 C++의 정신에 적합하지 않다고 생각합니다.

유일한 예외는 정적 기능입니다. 정적 함수는 소스 파일 (.c 또는 .cpp)에만 나타나며 (분명히) 다른 곳에서는 사용할 수 없습니다.

메서드/함수의 헤더 정의를 소스 파일에 복사하는 것이 귀찮기는하지만 동의하기 쉽게 코드 편집기를 구성 할 수 있습니다. 나는 Vim을 사용하고 빠른 스크립트는이 을 많이 도왔다.. 나는 비슷한 솔루션이 대부분의 다른 편집자들에게 존재한다고 생각한다.

어쨌든이 방법은 성가신 것처럼 보일 수 있지만 더 큰 유연성을 제공합니다. 헤더 파일 (.h, .hpp 또는 무엇이든)을 배포 한 다음 나중에 소스 파일의 구현을 투명하게 변경할 수 있습니다.

도 언급하면 ​​C/C++과 같은 것이 없습니다. C이 있고 C++이 있습니다. 그것들은 다른 언어들입니다 (실제로는 많은 것을 공유하지만 여전히).

+2

헤더의 추가 정보에 대한 좋은 지적 - 멤버 함수의 기본 매개 변수는 헤더에만 지정할 수 있으며 대부분의 템플릿 코드는 헤더에만 있습니다. – AshleysBrain

+0

@AshleysBrain : 실제로 좋은 예입니다. 내 답변에 추가했습니다. 감사 ! – ereOn

0

일부 기능을 선언하고 해당 구현을 작성했다는 것을 고려하면 .c/cpp 파일과 헤더 .h 파일이 있습니다.

당신은 그 기능을 사용하기 위해서는 무엇을해야 : 라이브러리를 만들기

  1. 를 (DLL/그래서 또는 정적 라이브러리 .A/lib 디렉토리 - I는 사용의 용이성에 대한 정적 라이브러리 추천 지금은)에서을 구현 파일이 있습니다.
  2. 함수 정의를 얻고 1 단계의 라이브러리와 링크하려면 헤더 파일 (#include)을 사용하십시오 (은 헤더 파일을 다시 작성하는 데 필요 없음).

>this <이 Visual Studio의 예제이지만 다른 개발 환경에도 적합합니다.

#include "stdio.h" 

int main(int c, char ** argv){ 
    puts("Hello world"); 
} 

설명 : 1. 표준 입출력

+3

실제로 라이브러리를 만들 필요가 없습니다. 당신은 또한 객체 파일에 링크 할 수 있습니다 (완성을 위해서). –

+0

@ Space_C0wb0y True – INS

0

이것은 내가 잘못 읽고 여기에 재 사용의 기본적인 예입니다, 당신의 첫 번째 질문에 대답하지 않은 가정, 초보적인 질문처럼 보인다 .h는 puts()라는 함수 정의를 포함하는 C 헤더 파일입니다. 2. 기본에서는 puts()가 포함 된 정의에서 호출됩니다.

일부 컴파일러에는 gcc를 포함하여 헤더 생성 옵션이 있습니다.

0

C++의 헤더와 소스 파일에 대해서는 항상 verymuchconfusion입니다. 내가 제공 한 링크는 조금 더 명확히하는 데 도움이 될 것입니다.

원본 파일에서 헤더를 추출하려는 경우 잘못된 방향으로 이동했을 가능성이 큽니다. 일반적으로 먼저 헤더 파일에 함수를 선언 한 다음 소스 파일에 해당 함수의 구현 (정의)을 제공합니다. 함수가 실제로 클래스의 메소드 인 경우 헤더 파일에 정의를 제공 할 수도 있습니다.

기술적으로, 헤더 파일은 실제로 프리 프로세서에 의해 소스 파일에 삽입 된 텍스트의 단지 무리입니다 :

#include <vector> 

정확한 장소에 파일 벡터의 내용을 삽입하는 전처리를 알려줍니다 어디에 #include이 나타납니다. 이것은 정말로 텍스트 대체입니다. 따라서 헤더 파일은 특수한 언어 구조가 아닙니다. 그들은 정상적인 코드를 포함합니다. 그러나이 코드를 별도의 파일에 넣으면 전 처리기를 사용하여 다른 파일에 쉽게 포함 할 수 있습니다.

+0

+1 가장 좋은 답변 중 하나임 아마도 – nico

+0

-1 헤더/소스 파일이 작동하는 방식에 대한 설명이지 질문에 대한 대답이 아닙니다. –

+0

제 의견으로는 질문에 대한 질문에 OP가 헤더 작동 방식을 이해하지 못하는 것으로 나타났습니다. 그가 그렇게했다면, 그는 자신의 질문에 스스로 대답 할 수있을 것입니다. 자신의 문제를 해결하지만 처음에는 그것을 이해하는 데 도움이되지 않는 모든 대답은 실제로 도움이되지 않습니다. 나는 그에게 스스로 문제를 해결하는 데 필요한 모든 정보를 제공했다고 생각합니다. –

0

내가 그것을이 물어 저를 이끄는 것입니다 좋은 질문이라고 생각 : Visual studio: automatically update C++ cpp/header file when the other is changed?

이 언급 한 몇 가지 리팩토링 도구는하지만 불행히도 나는 완벽한 해결책이 있다고 생각하지 않는다; 함수 서명을 두 번 작성하면됩니다. 구현을 인라인으로 작성하는 경우는 예외이지만 항상 그렇게 할 수 없거나하지 않아야하는 이유가 있습니다.

1

원본에서 헤더를 자동으로 생성 할 필요가 없거나 원하는 것은 아닙니다. 단일 파일을 작성하고 헤더 파일과 소스 파일로이를 지능적으로 나눌 수있는 도구가 필요합니다.

불행히도, 나는 그런 도구를 알지 못합니다. 분명히 하나를 작성할 수는 있지만 주어진 C++ 프론트 엔드가 필요합니다.clang을 사용하여 글을 쓸 수도 있지만, 상당한 양의 작업이 필요합니다.

0

Lazy C++에 관심이 있으실 것입니다. 그러나이 도구를 사용하기 전에 몇 가지 프로젝트를 기존 헤더 파일과 원본 파일로 구식 작업을 수행해야합니다. 나는 그것을 직접 사용하는 것으로 생각했지만, lzz 파일 대신에 실수로 생성 된 파일을 편집하고 있다고 생각했다.

0

그냥 헤더 파일에있는 모든 정의를 넣을 수 ...

common practice에 반하는하지만 unheard of 없습니다.

관련 문제