책리뷰, 번역/knk c programming 번역

Ch. 18 Declaration - 선언

PangDae 2022. 12. 17. 19:36

선언은 C 프로그래밍에서 중요한 역할을 한다. 변수와 함수를 선언하므로써 중요한 정보들을 제공하는데,

컴파일러가 목적 코드를 통해 잠재적인 오류를 확인하고 번역할 수 있도록한다.

이전 챕터들에서는 상세한 세부사항들 없이 선언들의 예시들을 봐왔었는데,

이번 챕터들을 을 통해 세부 사항들을 채워나갈 것이다.

선언들에 있어서 사용될 수 있는 상세한 선택지들을 알 아 나갈 것이며, 변수의 선언들과 함수의 선언들이 어떤 미묘한 차이가 있는지 알게 될것이다.

또한 Storage duration(저장 기한), scope(스코프), linkage(링크)의 중요한 개념들에 대해서 견고하게 다지게 될것이다.

특히 18.1에서 우리가 그동안 회피해 왔던 선언들의 일반적인 형태에서의 문법들에 대해서 배우게 될것이다.

 

18.1 Declaration Syntax (선언 문법)

선언은 컴파일러에게 식별자들의 의미를 제공한다.

만약 우리가

int i;

선언한다면, 컴파일러에게 현재 scope에서 i라는 이름은 int형 변수라는 것을 알려준다.

반대로

float f(float);

라는 선언은 f는 float 값을 반환하는 함수이며 함수의 인자도 float이라는 것을 컴파일러에게 알려준다.

 

일반적으로 선언은 아래와 같은 형태를 가진다:

Declaration-specifiers declarators ;

Declaration-specifiers는 변수나 함수의 특성을 묘사한다.

Declarators 는 이름을 제공하고 그들의 특징에 추가적인것을 제공한다.

 

Declartion-specifiers(선언-식별자)는 아래 3가지 카테고리를 제공한다.

 

1. Storage classes 

저장소 클래스에는 4가지 종류가 있다: auto, static, extern, register

최대 하나의 저장소 클래스가 선언에서 나타날 수 있으며 만약 존재 한다면 맨 앞에 와야 한다.

2. Type qualifiers

형식 권한자 C89 표준에서는 두가지만이 존재한다: const, volatile

C99에서는 하나가 더 추가되었다: restirict

하나의 선언 안에서 형식 수식자는 0개혹은 그 이상의 수식자가 포함 될 수 있다.

3. Type specifiers

형식 지정자의 키워드로는 void, char, short, int, long, float, double, signed, unsigned 같은 모든 지정자가 해당된다.

이러한 단어들은 챕터7에서 본것처럼 결합들이 가능하다

;결합의 순서는 상관이 없다.(int unsigned long은 long unsigned int와 동일하다.

형식 지정자들은 또한 구조체, 연함체, 열거체들의 특징도 포함한다.

예를 들면 struct point {int x,y;}, struct{int x,y;}, struct point 들을 포함한다는 것이다.

typedef를 통해 만들어진 데이터 형의 이름들역시도 형식 지정자에 포함된다.

 

C99에서는 4번째 선언 식별자인 function specifier(함수식별자)도 존재한다.

이 함수 식별자는 함수의 선언에서 만 사용된다.

이 카테고리에는 키워드가 inline인 하나의 단어만 포함된다.

형식 수식자들과 형식 지정자들은 저장소 클래스 뒤에 와야하며, 다른 별도의 순서는 상관이 없다.

선호도의 문제지만 필자는 형식 지정자앞에 형식 수식자를 작성하도록 하겠다.

 

Declarators(선언인자)들은 identifiers(식별자)들을 포함한다.

식별자들은 뒤에[]가 붙어 배열의 이름이 될 수도 있고, 식별자 앞에 *이 붙어 포인터가 될 수도 있으며

뒤에 ()가 붙어 함수의 이름이 될 수 있다.

선언인자들은 콤마로 분리되며, 변수를 의미하는 선언 인자들은 뒤에 initializer가 붙을 수도 있다.

 

이제 예시들을 통해 이러한 규칙들을 보자.

아래는 하나의 Storage class와 3개의 Declarator로 이루어진 선언의 예시이다.

 

                        (type specifier)

               static       float           x,y,z ;

(storage class)                         (declarators)

 

아래는 하나의 type specifier와 initializer가 존재하는 선언이며 이때 storage class는 존재하지 않는다.

 

const char month[] = "January" ;