3. 공백 규정 3. 2 정렬 규정 일련의 선언 내에 있는 변수 이름의 첫 문자를 정렬해야 합니다. struct 및 union의 멤버 이름은 첫 문자를 정렬해야 합니다. 인접한 대입문들 블록의 대입 연산자는 정렬되어야 합니다. 전처리기 지시문의 #는 #if 또는 #ifdef 시퀀스 내에서 지시문 자체가 들여쓰기될 수 있지만 항상 라인의 시작 부분에 위치해야 합니다. 예시 #ifdef USE_UNICODE_STRINGS # define BUFFER_BYTES 128 #else # define BUFFER_BYTES 64 #endif … typedef struct { uint8_t buffer[BUFFER_BYTES]; uint8_t checksum; } string_t; 이유 정렬은 시각적으로 유사성을 강..
3. 공백 규정 3. 1 공백 규정 if, while, for, switch, return 키워드와 같은 줄에 추가 표현이 있을 때 각 키워드 뒤에 공백 한 칸이 있어야 합니다. 각 할당 연산자 =, +=, -=, *=, /=, %=, &=, |=, ^=, ~=, !=는 항상 앞과 뒤에 공백 한 칸씩 있어야 합니다. 각 이항 연산자 +, -, *, /, %, =, ==, !=, , &, |, ^, &&, ||는 항상 앞과 뒤에 공백 한 칸씩 있어야 합니다. 각 단항 연산자 +, -, ++, --, !, ~는 피연산자와 공백 없이 붙어 있어야 합니다. 포인터 연산자 * 및 &는 선언문 내에서는 앞뒤로 공백이 있어야하지만, 선언문이 아닌 경우 피연산자와 공백없이 붙어 있어야 합니다. 삼항 연산자인 ? 와 :..
2. 주석 규정 2. 2 주석의 위치와 내용 규정 모든 주석은 명료하고 완전한 문장으로 적절한 철자법과 문법 그리고 적절한 구두점을 사용하여 작성되어야 한다. 가장 유용한 주석은 일반적으로 규모가 큰 알고리즘의 한 단계를 수행하는 코드 블록의 앞에 위치한다. 이러한 코드 블록 다음에 꼭 빈 라인을 넣어야 한다. 그리고 이 블록 앞의 주석은 들여쓰기 수준이 같아야 한다. 뻔한 코드에 주석을 달지 않도록 한다. 읽는 이가 C 언어를 안다고 가정하자. 예를 들어, 변수, 함수 이름 및 연산자에의해서 한 줄 코드의 의미가 명확하지 않지만 짧은 주석이 명확히 할 수 있는 경우에만 end-of-line 주석을 사용해야 한다. 특히, 아래와 같이 별 도움이 되지 않으면서 불필요한 주석을 사용하지 않는다. numero
2. 주석 규정 2.1 주석에서 허용하는 형식 규정 C++ 스타일의 단일 행 주석(//으로 시작하는)은 전통적인 C 스타일 주석(/* ... */)의 유용하고 수용 가능한 대안이다. 주석에는 전처리기 토큰(token)인 /*, //, \ 가 포함되지 않아야 한다. 아래 두 경우 일시적으로라도 주석을 작성해서는 안 된다. 코드 블록을 일시적으로 비활성화하려면 전처리기의 조건부 컴파일 기능을 사용한다(예: #if 0 … #endif). 디버그 출력 정보의 수준을 높이기 위해 특별히 존재하는 모든 라인 또는 코드 블록은 #ifndef NDEBUG … #endif로 둘러싸야 한다. 예시 /* The following code was meant to be part of the build... ... safety_..
1. 일반 규정 1.8 자주 사용하는 키워드 규정 선언한 모듈 외부에서 볼 필요가 없는 모든 함수와 변수는 키워드 static을 사용하여 선언해야 합니다. 적절한 경우에 키워드 const를 항상 사용해야 합니다. 사용 예는 다음과 같습니다. 초기화 이후 변하지 않는 변수를 선언할 때 수정돼서는 안될 참조 호출(call-by-reference) 함수의 매개변수를 정의할 때(예를 들어, char const *param) 수정돼서는 안될 struct나 union의 항목을 정의할 때(예를 들어, 메모리 사상 입출력 주변장치의 레지스터를 위한 구조체 오버레이에서) 상수를 생성하는 #define에 대한 대안으로 사용 적절한 경우 키워드 volatile를 항상 사용해야 합니다. 사용 예는 다음과 같습니다. 인터럽트 ..
1. 일반 규정 1.7 피해야할 키워드 규정 키워드 auto는 사용할 수 없습니다. 키워드 register는 사용할 수 없습니다. 키워드 goto는 사용하지 않는 것이 좋습니다. goto를 사용할 경우 동일한 블록내에서 이후에 선언된 레이블로만 점프합니다. 키워드 continue는 사용하지 않는 것이 좋습니다. 이유 키워드 auto는 C 언어의 불필요한 과거 기능입니다. 키워드 register는 프로그래머가 컴파일러보다 더 똑똑하다고 가정하고 있습니다. 현대 프로그래밍 관행에서 이러한 키워드를 사용해야 하는 설득력있는 이유는 없습니다. 키워드 goto와 continue는 C 언어에서 계속 사용되지만, 사용하면 코드가 엉망진창이 되는 경우가 많습니다. 특히, 구조적 프로그램의 일상적인 흐름제어에 반하는 점..
1. 일반 규정 1.6 캐스트 규정 캐스트를 사용하는 코드에서 가능한 값의 범위에 걸쳐 적절한 동작을 보장하는 방법을 설명하는 주석을 달아야 합니다. 예시 int abs (int arg) { return ((arg < 0) ? -arg : arg); } ... uint16_t sample = adc_read(ADC_CHANNEL_1); result = abs((int) sample); // WARNING: 32-bit int assumed. 이유 캐스트는 위험합니다. 위의 예제에서 부호없는 16비트 "sample" 변수는 부호가 있는 16비트 정수보다 큰 양의 값을 가질 수 있습니다. 이 경우 절대값도 부정확하게 됩니다. 따라서 int 형이 ISO C 표준에서의 16비트라면 오버플로우가 발생할 수 있습니..
1. 일반 규정 1.4 괄호 규정 유지관리자에게는 명확해 보이지 않을 수 있으므로, C 언어 자체의 우선 순위 규칙에 의존하지 말고, 실행 순서를 분명히 하기위해 괄호를 사용해야 한다. (또는 길이가 긴 실행문은 몇 줄에 나눠 코딩한다.) 단일 식별자 또는 상수가 아닌 한, 논리 연산자 AND(&&) 및 OR(||)의 피연산자에는 괄호를 사용해야 한다. 예시 if ((depth_in_cm > 0) && (depth_in_cm < MAX_DEPTH)) { depth_in_ft = convert_depth_to_ft(depth_in_cm); } 이유 C 언어의 구문에는 많은 연산자가 있습니다. 어떤 연산자를 먼저 계산해야 하는지 결정하는 우선 순위 규칙은 12개 이상의 우선 순위 레벨이 있을 정도로 복잡하며..
1. 일반 규정 1.3 중괄호 규정 중괄호는 항상 if, else, switch, while, do, for 다음에 나오는 코드 블록(복합문)을 둘러싸야 합니다. 이들 키워드 다음의 단문이나 빈 문장도 중괄호로 둘러싸야 합니다. 왼쪽 중괄호({)는 시작 키워드 아래줄에 사용해야 한다. 오른쪽 중괄호(})는 파일 뒷부분, 왼쪽 중괄호와 동일한 위치에 표시하여야 한다. 예시 { if (depth_in_ft > 10) dive_stage = DIVE_DEEP; // This is legal... else if (depth_in_ft > 0) dive_stage = DIVE_SHALLOW; // ... as is this. else { // But using braces is always safer. dive_..
1. 일반 규정 1.2 코드 길이 규정 프로그램에서 코드 한 줄의 길이는 최대 80자를 넘어서는 안된다. 추론 수시로 동료끼리의 리뷰 및 기타 코드 검사를 수행하게 되는데, 인쇄된 페이지에서 수행합니다. 이러한 인쇄물을 사용하려면 주의를 산만하게 하는 줄바꿈 뿐 아니라 누락된 문자(즉, 오른쪽 여백을 넘어서는 글자)가 없어야 합니다. 코드 길이 규칙을 준수하면 화면상에서도 나란하게 코드 차이점을 쉽게 구별할 수 있습니다. 시행 이 규칙에 대한 위반은 빌드 중 자동화된 스캔을 통해 감지될 수 있습니다.