수색…


비고

출처 : 정의와 선언의 차이점은 무엇입니까?

소스 (약하고 강한 기호의 경우) : https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

선언 및 정의 이해

선언은 식별자를 소개하고 유형, 객체 또는 함수와 같은 유형을 설명합니다. 선언은 컴파일러가 해당 식별자에 대한 참조를 받아 들일 필요가있는 것입니다. 다음은 선언문입니다.

extern int bar;
extern int g(int, int);
double f(int, double); /* extern can be omitted for function declarations */
double h1();           /* declaration without prototype */
double h2();           /* ditto                         */

정의는 실제로이 식별자를 인스턴스화 / 구현합니다. 이러한 엔티티에 대한 참조를 연결하기 위해 링커에서 필요로하는 것입니다. 위의 선언에 해당하는 정의입니다.

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
double h1(int a, int b) {return -1.5;}
double h2() {}  /* prototype is implied in definition, same as double h2(void) */

선언 대신에 정의를 사용할 수 있습니다.

그러나 정확히 한 번 정의해야합니다. 선언되고 어딘가에서 참조 된 것을 정의하는 것을 잊어 버린 경우, 링커는 참조를 링크 할 대상을 알지 못하고 누락 된 기호에 대해 불평합니다. 두 번 이상 뭔가를 정의하면 링커는 어떤 정의가 참조를 연결하고 중복 된 기호에 대해 불만을 쓰는지 모릅니다.

예외:

extern int i = 0;  /* defines i */
extern int j;  /* declares j */

이 예외는 "강력한 기호 대 약한 기호"개념을 사용하여 설명 할 수 있습니다 (링커 ​​관점에서). 자세한 설명은 여기 (슬라이드 22)를보십시오.

/* All are definitions. */
struct S { int a; int b; };             /* defines S */
struct X {                              /* defines X */
    int x;                              /* defines non-static data member x */
};
struct X anX;                                  /* defines anX */


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow