Skip to content

C 메모

Contents

Convention

먼저, 선언의 규칙을 알 수 있는 예시를 들자.

char const* const path_name[[deprecated]];

첫번째 const 는 그것의 왼쪽에 있는 char 에 영향을 미친다. * 는 이를 포인터로 만든다. 두번째 const 는 마찬가지로 그것의 왼쪽에 있는 것에 영향을 끼쳐서 상수로 만든다.

  • 연속 선언을 사용하면 안된다.

    가령 unsigned const* const a, b; 를 생각하자. 이때, bunsigned const 타입이다. 즉, 첫번째 const 는 타입에 영향을 미치고, 두번째 consta 에 영향을 미친다. 이처럼 연속 선언은 혼란을 만든다.

  • 포인터는 null 이 아니라고 가정 한다. 이를 위해 포인터 파라미터로 배열 표기(array)를 사용한다.

    /* These emphasize that the arguments cannot be null. */
    size_t strlen(char const string[static 1]);
    int main(int argc, char* argv[argc+1]);
    /* Compatible declarations for the same functions. */
    size_t strlen(const char *string);
    int main(int argc, char **argv);
    

    위 예시의 두 코드 블록은 같은 효과를 내는 선언이다. 그러나 첫번째 strlenmain 은 비어있지 않은 포인터를 받는다는 것을 강조한다.

  • 함수 포인터가 null 이 아니라고 가정한다. 이를 위해 함수 포인터 파라미터로 함수 표기를 사용한다.

    /* This emphasizes that the ``handler’’ argument cannot be null. */
    int atexit(void handler(void));
    /* Compatible declaration for the same function. */
    int atexit(void (*handler)(void));
    

    위 예시의 두 선언은 같은 효과를 내지만 첫번째 선언은 handler 가 비어있지 않은 포인터임을 강조한다.

  • 변수를 가능한 한 최대한 그것의 첫번째 사용에 가깝게 정의한다.

    C 언어 개발자가 빠지는 가장 큰 실수 중 하나는 변수 초기화가 되지 않은 상태이며, 이는 특히 포인터의 경우에 큰 문제가 된다.

  • 코드 블록 { ... } 에 프리픽스 표기를 사용한다. 다음 예시가 프리픽스 표기법이다.

    int main(int argc, char* argv[argc+1]) {
        puts("Hello world!");
        if (argc > 1) {
            while (true) {
                puts("some programs never stop");
            }
        } else {
            do {
                puts("but this one does");
            } while (false);
        }
        return EXIT_SUCCESS;
    }
    
  • 숫자들에 분리 기호를 사용한다.

    가령, 10,035.677,78910,035.677,789 라는 숫자를 C23 에서는 10'035.677'789 로 표기할 수 있다.

Type

  • Scalar type: 스칼라 타입은 모두 진리값을 갖는다.

  • Basic type:

  • 특수한 경우에 사용되는 타입:

  • Derived data types: C 의 모든 타입은 basic type 에서 파생된다. C 는 데이터를 파생하는 다음과 같은 4가지 방법을 제공한다.

    1. array: 같은 기본 타입의 값을 결합한 것.

    2. structure: 서로 다른 기본 타입을 결합한 것.

    3. pointer: 메모리에 있는 객체를 참조하는 것.

    4. union: 서로 다른 기본 타입을 같은 메모리 위치에 오버레이 시키는 것.

    5번째 방법인 typedef 도 있지만, 이는 새로운 타입을 만드는 것이 아니라 기존의 타입에 새로운 이름을 붙이는 것이다. 이는 #define 매크로를 사용하는 것과 비슷하다.

Operator

  • Value operators:

  • Object operators:

    @ 는 연산자, o 는 오브젝트, a 는 추가 값을 의미한다.

  • Type operators:

    이 연산자는 size_t 타입의 정수 상수를 반환한다.

Literal

  • 숫자 리터럴

  • 정수 리터럴에 사용되는 서픽스(suffix)































        Jens Gustedt. Modern C. Manning, In press, 9781617295812. hal-02383654v2