규칙 9

인라인 함수를 사용하여 작성할 수 있는 내용이라면 매개 변수가 있는 매크로를 사용하지 않는.



이유는 다음과 같다.

전 처리기 명령 #define을 이용하는 것은 위험하다. 특히 매개 변수가 있는 매크로에 따른 위험이 크다. 위 그림에 나와있는 문장과 같이 괄호가 광범위 하게 걸치기 때문에 "MAX (i + +, j + +)"와 같은 호출에 의도하지 않게 2배 증가가 실행될 가능성을 배제할 수 없다.


이외에도 부호 있는 데이터와 부호 없는 데이터 비교와 같은 매크로의 잘못된 사용에 대한 위험이 있다. 매크로의 경우 함수와 달리 컴파일러 인수의 데이터 형식 검사가 작동하지 않는다. 또한 "inline" 원래 C + + 언어 키워드 이었지만 "ISO / IEC 9899:1999"에서 C 언어 표준에 추가 되었다.




규칙 10

변수를 선언할 때 ", (쉼표)"를 사용하지 않는다.


변수 y를 포인터 형으로 하고 싶은지 어떤지 알기 어렵다.


이유는 다음과 같다.

변수 선언을 각각 독립적인 문장으로 작성하는 수고는 적다. 대조적으로 컴파일러와 코드 관리 담당자가 위 그림과 같은 기술이 의도하는 내용을 오해 해 버리는 위험이 높다.



출처 : http://eetimes.jp/article/23004

신고
by 흥배 2010.01.14 08:30

규칙 6

정수 비트 길이와 바이트가 문제가 될 때 char 또는 short, int, long, long long 같은 데이터 형식을 사용하지 않고 고정 길이 데이터 형식을 이용한다.



C 언어의 표준으로 규정되어 있는 부호 및 부호 없는 고정 길이 정수는 위와 같다.

이유는 다음과 같다. ISO가 개발한 C 언어 표준 "ISO / IEC 9899"에서는 char 또는 short, int, long, long long 같은 데이터 형식의 길이(비트 길이)에 대한 처리 계에 마다 정의하는 것이 허용되며 이식성 문제를 일으킨다.


1999년에 개정된 "ISO / IEC 9899:1999"에서도 이 문제의 잠재적인 원인은 해결되지 않았지만 표 1에 표시한 비트 길이를 고유하게 정의한 데이터 형식이 추가되었다. 이 새로운 형식은 "stdint.h"라는 헤더 파일에 정의되어있다.

(흥배 : Visual C++을 사용하는 경우 C99 표준이 구현되어 있지 않기 때문의 위의 표에 나타난 데이터 형을 사용할 수 없습니다. 그러나 Windows의 경우 64비트가 나오면서 위 표와 비슷하게 데이터 길이를 표시하는 방법을 사용하기를 권장하고 있습니다. 즉 short는 INT16, int는 INT32 등으로 대신 사용할 수 있습니다. 저는 64비트 프로그래밍을 시작한 작년부터 short, int 등을 사용하지 않고 INT16, INT32를 사용하고 있습니다. )




규칙 7

"& (AND )", "|( OR )", "~( 비트 반전 )", "^( XOR )", "<<( 왼쪽 시프트 )", ">>( 오른쪽 이동) " 같은 비트 연산자를 부호 있는 정수 값에 적용하지 않는다.



이유는 C 언어 표준이 예를 들면 "2의 보수를 사용"과 같이 부호 있는 정수 데이터의 표현 방식을 규정하고 있지 않기 때문이다. 부호 있는 정수 값에 비트 연산을 실시한 결과는 처리 계에 의존하고 있는 실정이다.




규칙 8

부호 있는 정수와 부호 없는 정수를 결합하거나 비교 하지 않는다. 이 원칙을 지키기 위해 부호 없는 10 진수 정수의 끝에는 "u"를 붙인다.



이유는 다음과 같다. 부호 있는 정수 변수에 저장된 이진 데이터 처리에 대한 자세한 내용은 C 언어 표준은 처리 기관에 의존하게 되어 있다. 게다가 부호 있는 정수와 부호 없는 정수를 결합한 결과로 발생하는 버그는 실제로 연산 데이터의 내용에 의존하기 때문에 발견이 어렵다.

(흥배 : 저는 딱히 u를 붙이지는 않지만 저는 언제나 VC++에서 경고 레벨을 ‘4’로 설정합니다. 경고 레벨 4에서는 부호 있는 정수와 부호 없는 정수를 같이 사용하면 바로 경고가 나오기 때문에 문제를 사전에 방지합니다)



출처 : http://eetimes.jp/article/23004


신고
by 흥배 2010.01.11 08:30

규칙 3

함수나 변수를 그것이 정의된 모듈 외부에 공개할 필요가 없는 경우는 static 키워드를 사용하여 선언한다.


이유는 다음과 같다. C 언어의 static 키워드는 여러 가지 의미가 있다. 모듈 수준에서 전역 변수와 함수를 static 키워드를 붙여서 선언하는 경우 다른 모듈의 함수를 사용하여 잘못된 접근으로부터 보호할 수 있다. 이러한 static 키워드 사용은 캡슐화로 연결한다.




규칙 4

다음과 같은 경우는 항상 volatile 수정자를 사용하여 선언한다.


  1. 모든 인터럽트 서비스 루틴에서 사용되는 전역 변수를 선언할 때
    .
  2. 2개 이상의 작업에서 사용되는 전역 변수를 선언할 때.
  3. 메모리 매핑된 I / O 방식을 채택한 주변 장치 레지스터 셋에 접근하기 위한 포인터 변수를 선언할 때. 예 "timer_t volatile const * p_timer"


이유는 다음과 같다. 컴파일러가 병렬로 실행되는 여러 스레드에 의해 변경될 수 있는 변수와 레지스터인 경우에도 읽기 / 쓰기 코드가 불 필요하다고 판단하여 코드 자체를 삭제하도록 최적화 할 수 있다.


예를 들면 다음과 같은 경우이다.

한 스레드 "A"가 특정 조건의 경우 해당 변수의 값을 변경한다고 하자. 다른 스레드 "B"는 변수를 폴링 하고 있으며 값이 변경되었을 때 어떤 처리를 한다. 이 때 스레드 B의 사이에 변수의 값을 변경하는 코드가 작성되어 있지 않으면 컴파일러는 해당 변수의 값은 변경되지 않는 것으로 판단하여 최적화할 수 있다. 그러면 컴파일 된 오브젝트 코드에서는 변수를 폴링 하는 코드가 제거 되어 버리기도 한다.


volatile 수정자를 적절히 사용하면 이러한 컴파일러 최적화 기능이 무효화 되어 코드 전체에 걸친 발견하기 어려운 버그 제거로 연결한다.




규칙 5

주석을 중첩시키지 않는다.


그리고 비록 일시적이라도 주석 블록을 해제하는 용도(주석)로 주석을 사용하지 않는다.

일시적으로 코드 블록을 해제하려면 전처리기 조건부 컴파일 기능을 사용한다.

예 "# if 0 ... # endif"


이유는 중첩 주석을 사용하던가 주석에서 코드 블록을 해제 하거나 하면 컴파일 하여 생성되는 최종적인 실행 모듈에서 무효로 했던 코드가 들어가 버릴 위험이 생긴다.



출처 : http://eetimes.jp/article/23004


신고
by 흥배 2010.01.08 10:30

왜 코딩 규칙이 필요할까?


코딩 규칙은 소프트웨어 개발자가 코드 작성에 대한 규칙을 정리한 것이다.

소프트웨어 개발 업체인 팀과 기업 단위에서 그런 코딩 규칙을 적용하면 많은 이익을 얻을 수 있다.

예를 들어 소프트웨어의 안정성과 이동성을 강화한 최소한의 수고 것만으로 그 소프트웨어를 재사용 할 수 있게 된다. 또 코드 내용을 검토하고 설명하는 데 필요한 시간을 줄일 수 있다.


코딩 규칙을 적용함으로써 얻을 수 있는 이익 중 가장 큰 장점은 버그를 줄일 수 있는 것이다. 소프트웨어 개발 비용을 낮추기 위한 중요한 전략은 컴파일러와 링커, 소스 코드의 정적 분석 도구 등이 자동으로 버그를 제거하도록 코드를 작성하는 것 즉 코드를 실행 전에 버그를 최대한 발생하지 않게 하는 것이다.


소스 코드에 적절한 의견을 써 놓으면 그 코드에 참여하는 모든 소프트웨어 개발자가 소프트웨어를 구성하는 변수와 함수 모듈의 올바른 사용법과 의미를 쉽게 이해할 수 있다.




여러 코딩 규칙


C 언어를 위한 코딩 규칙은 얼마든지 있다. 예를 들면 유럽의 자동차 업계의 MISRA (Motor Industry Software Reliability Association)가 발표한 자동차 소프트웨어 개발에 C 언어를 사용하는 것에 대한 지침 "Guidelines for the Use of the C Language in Critical Systems (MISRA - C : 2004)"가 있다. MISRA – C가 높은 안전성이 요구되는 기기의 설계에 대하여 통찰력이 있으며 이 지침은 C에서 더 안전한 소프트웨어를 작성할 수 있도록 규정 되어있다.


코딩 규칙과 MISRA - C는 공통점이 있지만 차이점도 있다. 코딩 규칙은 주로 작성하는 방법에 중점을 두고 있다. 그것에 비해 MISRA - C는 버그를 발생시키지 않기 위하여 중요한 규칙을 규정 하고 있다.


따라서 필자가 속한 팀은 필요에 직면하여 자신의 코딩 규칙을 개발했다. 이 코딩 규칙은 버그를 만들지 않는 코드를 작성하는 관점에서 완전히 새롭게 만든 것이다.




버그를 만들지 않기 위한 규칙


규칙 1

if 문, else 절, switch 문, while 문, do 문, for 문 다음의 코드 블록을 항상 중괄호 "{}"로 한다.


코드가 1 줄이거나 아무 것도 기술하지 않는다고 해도 중괄호로 한다

이유는 다음과 같다. 예를 들면 if 문장에 적용 조건이 성립했을 때 처리해야 할 내용이 처음에는 "A" 1개의 문장으로 작성할 수 있다 하더라도 변경으로 추가하여 "A"와 "B"의 2개의 문장이 되어버렸다.


이 때 첫 번째 "A"를 중괄호로 묶고 있지 않았다면 "B"를 추가할 때 중괄호를 사용하는 것을 잊어버렸다면 "B"라는 작업이 if 문은 조건 성립 여부에 관계없이 항상 실행되는 것이다. 즉 새로운 버그를 낳은 것으로 이어진다.

이러한 어이없는 버그는 항상 코드 블록을 중괄호로 묶는 방식으로 하면 미연에 방지할 수 있다.




규칙 2

다음과 같은 경우는 항상 const 한정자를 사용하여 선언한다.


  1. 변수 초기화 후에 해당 값을 변경할 수 없다면 그 변수를 선언할 때 const 한정자를 붙인다.
  2. 함수에 값 참조(포인터)를 전달하고(call - by - reference) 그 값을 함수에서 변경할 수 없는 경우 이 함수를 선언할 때 인수에 const 한정자를 붙인다. 예 : "char const * p_data"
  3. 구조체 또는 공용 구조체의 멤버 중 변경할 수 없는 구성원은 const 한정자를 붙인다. 예를 들면 메모리 매핑된 I / O 방식을 채용한 주변 장치 레지스터에 접근하기 위한 구조체 멤버 등이다.
  4. #define에 정의된 숫자 상수의 데이터 형식을 엄격하게 하는 경우 const 한정자를 사용하여 선언한다.


이러한 이유는 컴파일러의 기능을 사용하여 데이터를 읽기 전용으로 하여 의도하지 않은 쓰기로부터 데이터를 보호하기 위해서이다.



출처 : http://eetimes.jp/article/23004

신고
by 흥배 2010.01.06 13:30
하드웨어 관련 사이트에 있던 글이라서 C++이 아닌 C 언어를 사용한 경우입니다.
C++이 C 언어와 비슷한 부분이 많기 때문에 거의 C++에도 다 적용되는 규칙입니다.

저는
규칙 1, 5, 6, 7, 8, 9, 10은 지키고 있습니다.
규칙 2는 아직은 반반 인 것 같습니다. 가능하면 const도 붙입니다.
규칙 3은 C++에서는 별로 필요 없을 것 같습니다.
규칙 4는 Windows에서 동기화 객체를 사용할 때 적용되므로 사용할 경우가 없더군요.

 

규칙 1
if 문, else 절, switch 문, while 문, do 문, for 문 다음의 코드 블록을 항상 중괄호 "{}"로 한다.


규칙 2
다음과 같은 경우는 항상 const 한정자를 사용하여 선언한다


규칙 3
함수나 변수를 그것이 정의된 모듈 외부에 공개할 필요가 없는 경우는 static 키워드를 사용하여 선언한다


규칙 4
다음과 같은 경우는 항상 volatile 수정자를 사용하여 선언한다


규칙 5
주석을 중첩시키지 않는다.



규칙 6
정수 비트 길이와 바이트가 문제가 될 때 char 또는 short, int, long, long long 같은 데이터 형식을 사용하지 않고 고정 길이 데이터 형식을 이용한다


규칙 7
"& (AND )", "|( OR )", "~( 비트 반전 )", "^( XOR )", "<<( 왼쪽 시프트 )", ">>( 오른쪽 이동) " 같은 비트 연산자를 부호 있는 정수 값에 적용하지 않는다

규칙 8
부호 있는 정수와 부호 없는 정수를 결합하거나 비교 하지 않는다. 이 원칙을 지키기 위해 부호 없는 10 진수 정수의 끝에는 "u"를 붙인다


규칙 9
인라인 함수를 사용하여 작성할 수 있는 내용이라면 매개 변수가 있는 매크로를 사용하지 않는다


규칙 10
변수를 선언할 때 ", (쉼표)"를 사용하지 않는다.




각 규칙의 자세한 설명은 다음 글에서 포스팅하겠습니다.

출처 : http://eetimes.jp/article/23004
저작자 표시
신고
by 흥배 2010.01.06 08:30
| 1 |

티스토리 툴바