C로 중대형 프로그램을 만들때 해더의 인클루드 관계에 관해 조언 부탁드립니다.

dingkyu의 이미지

언제나 여기서 좋은 이야기만 듣고가는 아직은 풋내기 프로그래머입니다.
어찌어찌해서 이제 C의 중수이상으로 거듭나기 위해
설계, 코딩을 혼자서 하게 되었는데요
프로그램의 규모가 아주 쪼오금 큽니다. (예기 들어보시면 장난하나...할지도..^^;;;)

암튼 여쭤보고 싶은건 C로 중형이상의 프로그램을 짤때
각 함수들과 헤더화일들간의 관계를 좀 구조적(?)으로 구성하고자 할때
지켜야 하는 원칙이나 룰 같은게 궁금합니다.

예를 들어 어떤 기능의 함수가 있으면 그 함수의 소스코드와
헤더화일을 인클루드 하는 식으로 다른 함수에서 자유로이
사용하게끔 설계를 하고 싶습니다.
그러나 함수에 사용되는 마크로나 구조체 등의 혼용이
그렇게 간단하지만은 않네요.

고수님들의 노하우를 좀 알려주시면 고맙겠습니다.

그리고 혹시 이에 관해 참고할만한 좋은 책 있으면 추천부탁드리겠습니다.

lugi의 이미지

저같은 경우는 헤더에 아래와 같이 정의합니다. 어떤 책에서 봤는데.. 어떤책인지 기억이..

#ifdef _CFILE_NAME_C_
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN void function1(void);
EXTERN void function2(void);

그리고 해당되는 c file 앞부분에 아래와 같이 정의 합니다.

#define _CFILE_NAME_C_

이렇게하면 해당 header를 include한 다른 파일은 extern이 붙게 되고
이 header를 구현한 c file에서는 extern이 붙지 않아 관리가 편리합니다.

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

rookey94의 이미지

제가 사용하는 방법을 올려 봅니다. 도움이 되었으면...좋겠네요...^^;;

#ifndef __CHANGE_H__ <== 중복 헤더 참조 방지
#define __CHANGE_H__

/*/////////////////////////////////////////////////////////////////////////*/

#ifdef __cplusplus
extern "C" {
#endif

/*/////////////////////////////////////////////////////////////////////////*/
#include "sql_define.h" <= sql관련 정의 include
#include "socketimpl.h" <= 소켓관련 정의 include
#include "stringimpl.h" <= 문자열 정의 include
#include "cfgimpl.h" <= 환경파일 정의 include

#ifdef _TUXEDO
#include "fml32.h"
#endif /* _TUXEDO */

/****************************************************************************
*
* define variable
*
*/

/****************************************************************************
*
* global value
*
*/

/****************************************************************************
*
* signal function
*
*/
__jcallbackspec void child_process_sigCapture(int nSigno);
__jcallbackspec void sigCapture(int nSigNo);

/****************************************************************************
*
* function
*
*/

boolean signal_thread(struct _jconfiguration* pconfig);

/*/////////////////////////////////////////////////////////////////////////*/

#ifdef __cplusplus
}
#endif

저는 각 함수의 목적에 맞게 정의후 헤당 하는 inclue을 필요시 참조하는 방식을 사용합니다.

댓글 달기

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