C 언어 파일 분할 하는 법 -_-;;

hbull의 이미지

안녕하세요?

이런 질문 올리기 민망하지만 하다가 잘 안되서 질문 올립니다.

C언어(WIPI C) 로 제작한 프로그램이 있는데요,

파일 하나로만 제작해서 소스코드가 상당히 길어졌는데 (약 5천줄) 함수 기능에 따라 파일로 분할하고 싶습니다.

만약 기존의 파일, 예를 들어 main.cpp 가 있는데, 여기서 계산하는 함수부분을 빼려면

calc.h 에 함수원형을 넣고,
calc.c 에 실제 함수와 calc.h 를 include 하고,

main.cpp 에서 calc.c를 include 하면 되는거 아닌가요?

이런저런 방법으로 계속 시도해봤는데, 잘 안되네요
답변 부탁드립니다.

hoppang의 이미지

include 하는건 헤더(.h)입니다.
========================
귀엽고 깜찍한 호빵님~ >ㅁ<

hys545의 이미지

include로 소스 파일 포함시켜도 문제없습니다.
어차피 전처리과정에서 부모파일의 일부분으로 되기 때문입니다.

즐린

즐린

chadr의 이미지

관습이라고 하긴 좀 문제가 있네요.
C언어는 기본적으로 링크 과정이 있습니다.

말씀하신 것 같이 include는 헤더만 한다는게 관습이라고 한다면
소스에 소스를 include하는게 정당하다는 말씀이 됩니다.

그렇게 되면 여러 소스를 한꺼번에 링크 하는 과정에서 중복되는 많은 symbol들은 어떻게 하실건가요?
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

shint의 이미지

http://shint.tistory.com/attachment/cfile4.uf@16608C254B9388AB841802.zip
저도 댓글 달 수 있는 질문이 있었군요 ㅋㅋ

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

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

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

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

pastime의 이미지

방법이야 별 문제가 없을 것 같은데
컴파일 명령이나 에러 메시지 등의 정보를 좀 더 상세히 알려주셔야
답변을 받으실 가능성이 높아지지 않을까요?
(개인적으로는 확장자가 cpp인 것이 마음에 걸립니다만..)

overcrash의 이미지

main 에서는 calc.c를 include하는게 아니구요, calc파일에서 헤더만 선언되어있다면, 컴파일시에 main과 calc를 같이 컴파일해주시면 됩니다.

ymir의 이미지

기존의 통짜로 되어 있는 파일에서..
몇몇 루틴만 calc.c 로 나눠서 저장한 후에..

main.cpp 에서 #include "calc.c" 를 부르고..
main.cpp 만 컴파일 하겠다는 의미인가요..?

뭐 이렇게 해도 별 문제는 없겠지만..
가급적 module 로 나눠서 각각 빌드하고..
링크하는 형태로 작업하시는게 나을 것 같네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

unsouled의 이미지

개발 환경 / 컴파일을 어떤 식으로 했는 지 적어주셔야 정확히 답을 드릴 수 있을 것 같습니다. IDE 를 사용하셨다면 웬만하면 같은 프로젝트에 넣어두면 IDE 에서 잘 빌드 해 줄텐데요.

main.c

#include <calc.h>

int main() {
  int result = calc();
  return 0;
}

calc.h

int calc();

calc.c

#include <calc.h>

int calc() {
  return 1;
}

만약 gcc 로 컴파일을 한다면,

gcc main.c calc.c -o calc

처럼 모든 소스 파일을 인자로 넣어주시던가.. (1)

gcc -c calc.c
gcc -c main.c
gcc calc.o main.o -o calc

처럼 컴파일과 링크를 별도로 해 주시는 방법(2)이 있습니다.

물론 #include "calc.c" 같이해도..

헤더들만 제대로 잘 선언해 줬다면(특히 헤더가 중복으로 include 되지 않도록.. 헤더에 #ifndef, #endif 를 사용하는 것을 추천)

컴파일이 잘 되어야 하는 게 정상이긴 합니다만...

일반적으로는 (2) 의 방법(+ Makefile 등의 빌드 스크립트)을 많이 쓰는 걸로 알고 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.