표준 코딩 0.0.2 입니다. 표준 코딩 정리 목적에 대한 글은, 이전에 올린 표준 코딩 0.0.1을 참고하여 주십시오. 아래는 새로 추가된 내용을 설명합니다.

주석

함수 이름을 위한 주석

함수 이름 하단에 아래와 같이 //---...--- 을 그어 함수 이름과 선언 모습이 더욱 돋보이게 합니다.

static int b1_color( color_t color)
//-------------------------------------------------------------------------------
// 설명: 1 bit 칼라에 대한 정수 값을 구한다.
// 인수: color       red, green, blue 칼라 값
// 반환: 정수 칼라 값
{
   printf( "구현 해야 함n");
   color = color;
   return  0;
}

앞서 말씀드리지 않았지만, 표준 코딩을 작성하면서 울트라 에디터나 다른 유명 에디터가 제공하는 " 문법 강조 기능"을 참고하여 작성하고 있습니다. 문법 강조 기능은 프로그램 코딩에 많은 도움을 줍니다. 함수 이름도 문법 강조 기능의 도움으로 루틴 부분과 구분하기 이롭다고 생각했습니다만, 밑에 인수가 있어도 두드려져 보이지 않아 불편할 때가 있습니다. 이에 (주)FALINUX오재경 팀장님께서 함수 이름 아래에 주석 라인을 건의해 주셔서 적용하게 되었고, 표준 코딩에 추가했습니다.

특히, 문법 강조에 다른 칼라로 출력되지 않는 유저 정의 함수에서는 주석 라인을 사용하니 함수 선언이 눈에 더욱 잘 띄었습니다.

함수, 변수 명명법

변수 이름 명명법 - 변수 타입 접두사 사용

변수 이름만 보아도 척 알아 볼 수 있는 정보가 많다면 좋겠습니다만, 자칫 잘못하면 배보다 배꼽이 큰 경우가 많습니다. 헝가리안식 표기법을 보면, 변수 특성에 맞추어 1 자에서 3 자 사이의 접두사를 정의하여, 그에 맞추어 변수를 명명하지만, 우리 표준 코딩 방법은 소문자와 밑줄을 사용하기 때문에 1 자 이상의 접두사를 사용하고 밑줄까지 붙이면 변수 이름 매우 길게 됩니다.

int   ch_error_code;

이런 명명법에 대해서, 제가 운영하는 jwmx 블로그에 소우님께서 건의하신 내용인데, 접두사를 모두 1 자로 하고, 밑줄없이 연결하는 것입니다. 이렇게 말이죠.

int      itmp
char     ctmp
long     ltmp

간결하니 좋지 않습니까? 이 부분에 대한 의견이 있겠습니다만, 다른 의견이나 말씀이 있으실 때 까지 표준코디에 추가하겠습니다. 단, int에 대해 "i" 로 설정하면 long의 접두사 "l" 과 구분이 안 되므로 int 는 "n" 으로 하면서 아래와 같이 정리해 보았습니다.

변수 타입 접두사
접두사 때문에 변수 이름 읽기가 힘들다면 접두사에 밑줄을
추가할 수 있다.
int n
short w
long l
char c
char * pc  또는 p
short * pw 또는 p
long * pl 또는 p
FILE * pf 또는 p
사용자 정의 스트럭쳐 대표 접두사+밑줄
예) bmp_background
사용자 정의 스트럭쳐 * p+대표 접두사+밑줄
예) pbmp_background
long * pl 또는 p

이를 이용하면 아래와 같이 명명할 수 있습니다.

int   ncount;
int   ckey;
short wcoor_x;
int   ltime;
char *pcmessage;
char *pmessage;
FILE  *fplogfile;  또는   fp_logfile;
   

unsigned 처리도 함께 했으면 좋겠습니다만, 그렇게 되면 정말 배보다 배꼽이 클 수 있어서 제외했습니다.

광역 변수 이름 명명법 - 작성되는 위치의 접두사 사용

광역변수는 편리한 만큼 위험성도 높아서, 광역 변수 명명법에 대해 주장하는 말씀이 참 많습니다. 정리해 보면,

  • 앞에 광역을 뜻하는 "g_"를 추가한다.
    int g_nerror_code;
  • 아니다 변수 이름이 잘 안 보이고, 정수인지 문자인지에 대한 접두사를 쓰기 힘들다. 그러므로 뒤에 "_g"를 붙이자.
    int nerror_code_g;
  • 로컬 변수는 무조건 소문자. 광역 변수는 대소문자를 같이 사용한다.
    int nErrorCode;
  • "_g" 가 뒤에 있으면 눈에 잘 띄지 않는다. 앞에 "_" 를 붙이자.
    int _nerror_code;
  • "_" 문자 하나는 뵈지도 않는다 두개 붙이자.
    int __nerror_code;

정말 많지요? 이 외에도 다른 주장도 있습니다. 그러나 저는 라이브러리나 프로젝트에 따라 접두사를 사용하는 것이 좋지 않을까 판단되서 아래와 같이 정리했습니다.

  1. 라이브러리 제공 광역 변수
    라이브러리에서 제공되는 광역변수는, 어떤 라이브러리에서 제공하는지 알 수 있는지, 라이브러리의 축약 접두사를 사용합니다.

    예)

    int      gx_nerror_code;          // gx 그래픽 라이브러리에서 제공
    int      rs_nerror_code;          // rs 시리얼 라이브러리에서 제공
  1. 프로젝트 내에서 사용하는 광역 변수
    프로젝트 대표 접두사를 사용

    예)

    int      ibs_nerror_code;         // 빌딩 자동화 프로젝트에서 사용하는 광역변수
    

 

함수 이름 명명법

함수 이름에도 반환되는 변수의 타입을 알 수 있게 하자는 말씀도 있었고, 인수까지도 알 수 있게 하자는 말씀도 보았습니다만, 요즘 컴파일러의 강력한 warrning 기능에 따라, 이렇게 까지는 필요 없지 않나 조심스럽게 말씀을 드리면서, 함수 이름 명명법은 광역 변수처럼 정하는 것으로 일단 정했습니다. 즉, 라이브러리와 프로젝트처럼 작성되고 제공되는 곳의 접두사를 사용한다는 말씀이 되겠습니다.

  1. 라이브러리 제공 함수
    어떤 라이브러리에서 제공되는 함수인지, 라이브러리의 축약 접두사를 사용합니다.

예)

int      gx_error_sring();        // gx 그래픽 라이브러리에서 제공
int      rs_open();               // rs 시리얼 라이브러리에서 제공
  1. 프로젝트 내에서 사용하는 함수
    프로젝트 대표 접두사를 사용

예)

int      ibs_show_message( "종료합니다.");         // 빌딩 자동화 프로젝트에서 사용하는 광역변수
주의!!
  • 단, static 으로 정의된 모듈 내부 함수는 접두사를 생략한다.

결언

아직 더 정리할 내용이 많습니다만, 앞으로 계속 추가해 가도록 하겠습니다. 이제 위의 내용을 정리해 보겠습니다. 표준 코딩에 대해서는 당연히 여러 주장이 있겠습니다. 좋은 생각과 많은 의견을 올려 주시면, 수렴하여 표준을 계속 정립해 나가겠습니다.

포럼 표준 코딩 0.0.2

  1. 상수는 모두 대문자와 밑줄(언더 바)을 이용한다.
    BUFFER_SIZE, WIDTH_MAX, USER_CAPTON

  2. 함수와 변수는 모두 소문자와 밑줄을 이용한다.
    show_message(), bmp_filename, hide()

  3. 광역 변수 명명법
    1. 라이브러리 제공 광역 변수
      라이브러리에서 제공되는 광역변수는, 어떤 라이브러리에서 제공하는지 알 수 있는지, 라이브러리의 축약 접두사를 사용합니다.

      예)

      int      gx_nerror_code;          // gx 그래픽 라이브러리에서 제공
      int      rs_nerror_code;          // rs 시리얼 라이브러리에서 제공
    1. 프로젝트 내에서 사용하는 광역 변수
      프로젝트 대표 접두사를 사용

      예)

      int      ibs_nerror_code;         // 빌딩 자동화 프로젝트에서 사용하는 광역변수
      

  4. 일반 변수 명명법
    변수 이름 앞에 아래와 같이 정의된 접두사를 붙여 명명합니다.
    변수 타입 접두사
    접두사 때문에 변수 이름 읽기가 힘들다면 접두사에 밑줄을
    추가할 수 있다.
    int n
    short w
    long l
    char c
    char * pc  또는 p
    short * pw 또는 p
    long * pl 또는 p
    FILE * pf 또는 p
    사용자 정의 스트럭쳐 대표 접두사+밑줄
    예) bmp_background
    사용자 정의 스트럭쳐 * p+대표 접두사+밑줄
    예) pbmp_background
    long * pl 또는 p



  5. 함수 명명법
    1. 라이브러리 제공 함수
      어떤 라이브러리에서 제공되는 함수인지, 라이브러리의 축약 접두사를 사용합니다.

      예)

      int      gx_error_sring();        // gx 그래픽 라이브러리에서 제공
      int      rs_open();               // rs 시리얼 라이브러리에서 제공


    1. 프로젝트 내에서 사용하는 함수
      프로젝트 대표 접두사를 사용

      예)

      int ibs_show_message( "종료합니다.");   // 빌딩 자동화 프로젝트에서 사용하는 광역변수
      
    주의!!
    • 단, static 으로 정의된 모듈 내부 함수는 접두사를 생략합니다.

  6. 블록 들여쓰기는 아래와 같이 블록의 시작과 종료 문자를 블록의 시작에 위치합니다.
    if ( )
    {
    }
    else
    {
    }
    for ()
    {
    }
    while ()
    {
    }
            


  7. 탭 문자 크기를 공백 문자 3개로 한다.

  8. 탭 문자를 사용하지 않는다. 들여쓰기는 모두 공백 문자를 이용한다.

  9. 모듈 별 주석 달기(소스 상단의 전체 주석)
    /* */를 사용하며, /*****.....**** 의 마지막 별은 81 열까지 배열한다.
    /********************************************************************************
     모  듈 : tcp/udp 소켓 사용
     작성자 : 장길석
     버  전 : 0.0.2
     설  명 : netrx 를 위한 tcp/udp 소켓 사용함수 정의 
     참  고 :
     
              1. tcp 는 서버 모드로 설정한다.
              2. udp 는 상대 PC 로 전송하기 위한 IP 를 처음에
                 가질 수 없기 때문에 따로 상대 PC IP 를 지정하여
                 전송에 사용한다.
                 
                 ip_sock_t 에서 to_ip, to_addr
    
     버  전:
             0.0.1  tcp/udp 처리를 하나로 묶음
             0.0.2  udp 소켓을 위해 ip_sock_t 에 to_addr 과 to_ip 추가
                    to_ip   : string    목적지 ip
                    to_addr : in_addr_t 목적지 ip 에 대한 inet_addr() 값
    ********************************************************************************/
          

  10. 함수별 주석 달기
    함수 이름 밑에 '//' 주석 문을 사용하며, 설명, 참고, 인수, 반환을 입력한다. 작성할 내용이 없으면 생략
    dc_t *gx_get_buffer_dc( int width, int height)
    // ------------------------------------------------------------------------------ 81컬럼까지 긋는다.
    // 설명: 화면 출력을 빠르게 하기 위한 버퍼 DC를 구함.
    // 참고: BitBlt를 빠르게 처리하기 위해 DC Type를 DCTYPE_SCREEN으로 지정한다.
    // 인수: width       버퍼의 폭
    //       height      버퍼의 높이
    // 반환: 버퍼 Device Context 핸들
    {
       int   szStruct;
       dc_t  *dc;
    
       szStruct = sizeof( dc_t);
          

  11. 함수 내부 주석 달기
    // 와 /* */ 두 가지 모두 사용한다.
                        :
    dc->release_dc       = release_buffer_dc;
    dc->bits_per_pixel= gx_fb.bits_per_pixel;   
    
    // 칼라 깊이에 따라 라인 별 소요되는 바이트를 계산하며,
    // 깊이에 따른 가상 함수를 지정한다.
    
    switch( gx_fb.colors)
    {
    case 1   :  dc->bytes_per_line  = width / 8;
                        :
          

    또는

                        :
    dc->release_dc       = release_buffer_dc;
    dc->bits_per_pixel= gx_fb.bits_per_pixel;   
    /*
     * 칼라 깊이에 따라 라인 별 소요되는 바이트를 계산하며,
     * 깊이에 따른 가상 함수를 지정한다.
     */
    switch( gx_fb.colors)
    {
    case 1   :  dc->bytes_per_line  = width / 8;
                        :
          

  12. 행별 주석 달기
    81 열에 // 코드로 주석을 삽입한다. 81 열인 이유는 탭 문자에 대해 공백문자 3개를 이용하기 때문입니다.