[c]함수를 어떻게 분리 하십니까?

ssif의 이미지

*.h *.c로 나누어 해더파일을 *.c에 인클루드 할때 함수를 어떻게
분리하는 지 궁금합니다. 하나의 파일에서 함수 하나만 외부에서 쓰고 나머지 함수는 그 파일 내에서만 사용하는 형식으로 사용하시는지 또는 하나의 파일에 들어가는 모든 함수를 외부에서 사용 할 수 있도록 나누시는 지 궁금합니다.

어찌보면 스타일에 따라 틀릴수도 있지만,실제로 다른 분들은 어떻게 사용하시는지 궁금해서 그렇습니다.

미리,감사드립니다.

cinsk의 이미지

스타일적인 문제로 여기기에는 조금 무리가 있는 부분입니다. 쓸데없는 여러 이름들이 넘쳐나는 것을 방지하기 위해서, 외부로 알려질 필요가 없는 함수 이름들은 static으로 선언하는 것이 좋습니다.

mirr의 이미지

음..규모가 어느정도 돼느냐에 따라서 달라지긴 하는데요
보통 프로젝트라고 친다면 저는 일단 각 기능에 관련된 파일들을
따로 만들고 그 파일에서 참조하는 함수들을 외부로 관련헤더로
작성해 놓는 편입니다.

예를들어 입출력루틴을 담당하는 io.c라는 코드를 만들었으면
io.h라는 헤더파일을 작성하는것이죠..
물론 각 파일당 라인수가 5천이 안된다면(미만) 그냥 한파일에 작성합니다.

대략 3천~5천라인정도로 끊는 편이지요...
그리고 기능별로 구분해서 헤더정의를 하기도 합니다.

결국 써놓구보니...대략 내키는대로인 셈인건가요? 푸힛

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

ssehoony의 이미지

c++ 에서 보면 가끔 private 나 protected 로 선언했는데 외부에서 접근할 필요가 있어서 public 으로 수정하거나 friend 를 만드는 경우가 있습니다.

이 처럼 c 에서도 해당 라이브러리의 내부 구조를 잘 아는 사람은 low level 한 함수를 쓰고 싶을 때가 있겠죠? (제 경우는 주로 타임 크리티컬한 부분에서)
이때 static 으로 제한해 놓으면 외부에서 사용하지 못 하는 불편함이 있어서 저 같은 경우는 외부에서 사용할 필요가 별로 없는(혹은 low level 한) 함수는 __ 를 함수 앞에 붙입니다. 가령 get_filename() 이라는 함수가 외부에서 사용할 필요가 없다면 __get_filenme() 이런식으로요.

c++ 에서도 역시 드물게 외부에서 사용할 필요가 있다면 friend 활용 보다는, public 으로 선언하고 대신 멤버함수명 앞에 __ 를 붙입니다. (멤버 변수에도 역시 같은 규칙을 적용합니다.)

그리고 파일 단위는 사이즈는 신경쓰지 않고 기능별로 나눕니다. 파일 사이즈가 커지면 컴팔 타임이 길어지는 압박이 있지만, 컴팔러가 고생하지 내가 고생하는거 아니니깐 걍 무시합니다. 하나로 되어 있어야 find 같은 걸로 찾을 때 편해서요. :D

ins878의 이미지

저는 학생이라 그렇게 프로그램을 많이 짜보지는 않았지만... 저 같은 경우에는 함수의 기능별로 구분해서 파일에 저장을 합니다.
그리고 파일안에다 주석으로 각 함수를 최대한 빨리, 쉽게 볼 수 있도록 구분해 놓습니다.
실무에서는 어떻게 쓰는 줄은 모르지만, 주석으로 최대한 보기좋게 구분해서 사용하는 편입니다. (물론 그것때문에 라인수가 많이 늘어나지만요....^^)

익명 사용자의 이미지

ins878 wrote:

...
실무에서는 어떻게 쓰는 줄은 모르지만, 주석으로 최대한 보기좋게 구분해서 사용하는 편입니다. (물론 그것때문에 라인수가 많이 늘어나지만요....^^)

실무에서도 주석은 많이 다는게 좋습니다. :twisted:
묘한 조직에서는 일부러 주석을 없애기도 한다는... :evil:
bus710의 이미지

8 비트 프로세서를 쓰면서는...

주변 장치 드라이버, 메인 함수 및 인터럽트 관련, 어플리케이션 부분, 전역 변수 및 전처리 문

이 정도로 나눕니다^^

워낙에 무계획적으로 짜는 편이라서....또 전처리기를 능숙하게 쓰지 못하는 관계로.... 스파게티는 좀 만들줄 압니다만....:oops:

life is only one time

nohmad의 이미지

ssehoony wrote:
c++ 에서 보면 가끔 private 나 protected 로 선언했는데 외부에서 접근할 필요가 있어서 public 으로 수정하거나 friend 를 만드는 경우가 있습니다.

이 처럼 c 에서도 해당 라이브러리의 내부 구조를 잘 아는 사람은 low level 한 함수를 쓰고 싶을 때가 있겠죠? (제 경우는 주로 타임 크리티컬한 부분에서)
이때 static 으로 제한해 놓으면 외부에서 사용하지 못 하는 불편함이 있어서 저 같은 경우는 외부에서 사용할 필요가 별로 없는(혹은 low level 한) 함수는 __ 를 함수 앞에 붙입니다. 가령 get_filename() 이라는 함수가 외부에서 사용할 필요가 없다면 __get_filenme() 이런식으로요.

c++ 에서도 역시 드물게 외부에서 사용할 필요가 있다면 friend 활용 보다는, public 으로 선언하고 대신 멤버함수명 앞에 __ 를 붙입니다. (멤버 변수에도 역시 같은 규칙을 적용합니다.)

그리고 파일 단위는 사이즈는 신경쓰지 않고 기능별로 나눕니다. 파일 사이즈가 커지면 컴팔 타임이 길어지는 압박이 있지만, 컴팔러가 고생하지 내가 고생하는거 아니니깐 걍 무시합니다. 하나로 되어 있어야 find 같은 걸로 찾을 때 편해서요. :D

C/C++ 표준에서 언더스코어(_)로 시작하는 이름은 표준 라이브러리 제작자에게 예약되어 있는 것으로 알고 있고, 실제로 표준 라이브러리 소스를 보다보면 이름 충돌을 피하기 위해선지 대부분의 명칭들이 _로 시작하기도 해서, _로 시작하는 이름은 비록 에러가 없을지는 몰라도 잠재적인 지뢰로 간주하고 있었는데, 문제가 없으신지 모르겠네요.

구글에서 찾은 링크:
http://aips2.nrao.edu/docs/notes/140/node2.html
Programming in C++: Rules and Recommendations

Fe.head의 이미지

code complete 에 보면 c에서 private 함수 선언하는 방법이 대충 나오는데.

예를 들면 test.c가 소스라면

public 함수 header 파일은 test.h
private 함수 header 파일은 _test.h
를 쓰는것을 추천하더군요.

test.c 에는

#include "test.h"
#include "_test.h"
...

그외 test.c 에있는 함수를 쓸려면 #include "test.h"
..

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

김준경의 이미지

ssif wrote:
어찌보면 스타일에 따라 틀릴수도 있지만,실제로 다른 분들은 어떻게 사용하시는지 궁금해서 그렇습니다.

말씀하신대로 역시 코딩 스타일에 따라 많이 다를 것으로 생각됩니다만, 저같은 경우는 저를 포함한 프로그래머가 해당 모듈을 사용하는데 필요한 함수를 먼저 정해놓고 그걸 구현하는데 필요한 내용들을 내부에서만 쓸 수 있도록 만들어서 사용합니다.

예를 들자면 memory이라는 메모리 관련 모듈이 있다면 malloc, free, calloc 등등의 함수를 만들어놓고 이것을 구현하는데 필요한 내용(뭐 메모리 블럭 할당이라던가 이것저것..)을 내부에서만 사용될 수 있도록 만드는 그런 식이죠.

그래서인지 static을 이용해 내부 함수와 외부 함수의 구분을 명확하게 하는 편입니다. 만약 작성중에 외부에서 써야 할 내용이 있다면 분명 다른 프로그래머에게도 필요가 있을지도 모른다는 생각에 아예 공개하거나 사용할 수 있는 방법을 마련해줍니다.

하지만 변수는 특별한 일이 아니라면 공개하지 않는 편입니다. 한다면 아예 const로 막혀있는 구조체를 이용해 변수를 맵핑해주는 식으로 좀 안전하게 하는 방법도 있겠군요.

근데 도움이 되셨을지... -_-a

nohmad wrote:
C/C++ 표준에서 언더스코어(_)로 시작하는 이름은 표준 라이브러리 제작자에게 예약되어 있는 것으로 알고 있고, 실제로 표준 라이브러리 소스를 보다보면 이름 충돌을 피하기 위해선지 대부분의 명칭들이 _로 시작하기도 해서, _로 시작하는 이름은 비록 에러가 없을지는 몰라도 잠재적인 지뢰로 간주하고 있었는데, 문제가 없으신지 모르겠네요.

저도 습관상 앞에 언더스코어를 자주 사용하는 편인데, 아직까진 컴파일러에서 문제를 일으켰던 적이 없었습니다. 제가 다양한 컴파일러를 못써봐서 그런것도 없지않아 있는거 같은데.. 그래도 걱정되니 앞쪽에 있던 언더스코어를 뒤쪽으로 보내던가 해야겠군요. -_-

우선 좋은정보 감사합니다.

doldori의 이미지

김준경 wrote:
저도 습관상 앞에 언더스코어를 자주 사용하는 편인데, 아직까진 컴파일러에서 문제를 일으켰던 적이 없었습니다. 제가 다양한 컴파일러를 못써봐서 그런것도 없지않아 있는거 같은데.. 그래도 걱정되니 앞쪽에 있던 언더스코어를 뒤쪽으로 보내던가 해야겠군요. -_-

실제로 이 때문에 문제를 일으키는 것은 드물긴 합니다만 역시 피해야 한다고
생각합니다. 저는 딱 한 번 당해 봤습니다. 저희 회사에서 산 상용 코드에서 문제를
일으켰습니다. 그래서 그쪽에 항의를 했더니 유지보수 기간을 연장해 주더군요. ^^;
myohan의 이미지

vi에서 2화면을 넘지 말자를

신념으로 삼고 있습니다 ^^;

ps. 사장님 모니터 큰것좀 사주세요 ㅡㅜ
17인치 CRT ... OTL

---------------------------------------
blog : http://myohan.egloos.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.