원형과 비원형 (prototype & non-prototype)

MySprtlty·2023년 9월 3일
0

C

목록 보기
26/37

원형 선언/정의 이전에 있었던 비원형 선언/정의에 대해 다룬다.
결론부터 말하면 비원형 선언은 구식 기술이기 때문에, 무조건 원형 선언을 사용할 것을 권장한다.

🏷️원형과 비원형의 선언/정의

📌원형 선언/정의 (prototype declaration/definition)

  • 매개변수에 대한 정보가 주어지는 선언과 정의다.
  • 매개변수에 대한 정보란 매개변수 타입과 개수를 의미한다.

📌비원형 선언/정의 (non-prototype declaration/definition)

  • 매개변수 타입에 대한 정보가 주어지지 않는 선언과 정의다.
  • 구식 기술이기에 앞으로는 사용하지 않는 것을 권장한다.

🏷️비원형의 구조

📌비원형 선언

int func();
  • 매개변수에 대한 정보를 일체 주지 않는 것이기에 언제나 빈괄호 형태다.
  • 원형 선언이라면 반드시 void키워드를 넣어주어 매개변수에 대한 정보를 줘야 한다.

📌비원형 정의

  • 명칭 리스트에 존재하는 명칭이 선언 리스트에서 선언되지 않으면, int형으로 간주된다.
  • 비원형 정의는 비원형 선언을 동반하기에 선언 리스트가 있을지라도, 제대로된 인자 검사나 형변환을 수행하지 않는다.

🏷️형 지정자(type specifier, return type)에 대한 규칙

  • 원형/비원형 방식과 무관하게 선언과 정의에 따라 생략 여부가 결정된다.

📌함수 선언

  • 형지정자를 생략할 수 없다.
    • 원형
    func (int, double); /*wrong*/
    • 비원형
    func (); /*wrong*/

📌함수 정의

  • 형지정자를 생략할 수 있다.
  • 이때 형지정자를 생략하면 return타입은 int형으로 간주된다.
    • 원형
    func (int a, double b) /*correct*/
    {
        /*body*/
    }
    • 비원형
    func (a, b) /*correct*/
    int a;
    double b;
    {
        /*body*/
    }

🏷️()와 (void)

📌비원형 선언

int func();
  • 인자를 받지 않는다는 의미가 아니다.
  • 단지 매개변수에 대한 정보를 알 수 없기 때문에 비원형선언은 항상 ()형태다.
  • 인자에 대한 검사나 형변환을 수행하지 않는다.

📌비원형 정의

int func()
{
    /*body*/
}
  • 인자를 받지 않음을 의미한다.

📌원형 선언

int func(void);
  • 인자를 받지 않음을 매개변수 정보(값이 없음을 의미하는 void 타입)를 제공함을 통해 명시하고 있다.
  • 함수 선언문에서 인자를 받지 않음을 나타내려면 따라서 원형 선언을 해야한다.

📌원형 정의

int func(void)
{
    /*body*/
}

🏷️암시적 선언 (implicit declaration)

  • 함수 선언에 관해서만 해당된다.
  • 함수 호출이 존재하는 가장 안쪽 블록에, extern int func(); 선언이 존재하는 것처럼 번역한다.
  • 즉, return type은 무조건 int로 가정된다.

0개의 댓글