programing

임시 정의 정보

topblog 2023. 7. 22. 09:07
반응형

임시 정의 정보

잠정적 정의에 관한 책을 읽었는데,

임시 정의는 스토리지 클래스 지정자와 이니셜라이저가 없는 외부 데이터 선언입니다.변환 단위의 끝에 도달했지만 식별자에 대한 이니셜라이저와 함께 정의가 나타나지 않은 경우 임시 정의가 전체 정의가 됩니다.

위의 진술이 의미하는 바를 설명해 주시기 바랍니다.또한 선언과 정의의 차이점은 무엇입니까?저는 이것 때문에 헷갈렸어요. :( 그리고 이 프로그램은 왜 오류를 내지 않나요:

#include <stdio.h>

int a;      //Tentative definition
int a;      //similarly this declaration too.
int main()  //not getting any error with this code why its so?
{
    printf("hi");
} 

또한 이 코드의 문제점:

#include<stdio.h>
printf("Hi");
int main(void){
    return 0;
}

변수 선언은 "프로그램에 다음과 같은 이름과 유형을 가진 변수가 있습니다"라고 말합니다.

변수 정의에는 "컴파일러님, 지금 다음과 같은 이름과 유형의 변수에 메모리를 할당해 주십시오."라고 되어 있습니다.

따라서 동일한 변수에 대해 여러 개의 선언이 있을 수 있지만 정의는 하나만 있어야 합니다.

가 아닌 C 서 선 정 언 순 은 키 앞 나 옵 니 에 다 워 드 수 닌 아 에 가 의 니 옵 ▁in 다 나 ▁the ▁c ▁keyword ▁preceded ▁with ▁declar 에 앞 은 that ations ▁( ,▁pure▁c키순워수▁are서언선정(itionsextern첫 번째 예에서는 이 키워드가 없으므로 두 가지 정의가 사용됩니다.표면적으로는 이것이 문제인 것처럼 보이지만(사실 C++에서는 오류입니다), C는 모든 것이 일치하고 최대 한 개의 이니셜라이저가 있는 한 동일한 변환 단위에서 동일한 변수에 대한 다중 정의를 허용하는 특별한 "잠정 정의" 규칙을 가지고 있습니다.배후에 있는 C 컴파일러는 모든 잠정적인 정의를 단일 정의로 결합합니다.

다음과 같이 두 정의를 초기화하려고 시도한 적이 있습니까?

int a = 1;
int a = 2;

그러면 당신은 오류가 있었을 것입니다.

당신의 두 번째 질문은 더 간단합니다.C에서는 단순히 함수의 본문 외부에 실행 가능한 문을 둘 수 없습니다.그건 그냥 허용되지 않습니다.생각해 보십시오. 허용된다면 언제 실행될 것으로 예상하십니까?

첫 번째는 당신의 정의가 모두 유효하기 때문입니다.a임시적이며, 적합하다고 판단될 때마다 자주 복제할 수 있습니다.단위의 않았기 에 대해합니다.a외부 링크, 정적 저장 기간을 가지며 0으로 초기화됩니다.

두 번째 문제는 잠정적인 정의와는 아무런 관련이 없습니다.당신의.printf("Hi");기능을 수행하려면 함수 안에 있어야 합니다. 선언이나 정의(예외 또는 기타)가 아닙니다. 여기서는 허용되지 않습니다.

언급URL : https://stackoverflow.com/questions/3095861/about-tentative-definition

반응형