programing

C의 잠정적인 정의의 근거는 무엇입니까?

telecom 2023. 10. 17. 20:01
반응형

C의 잠정적인 정의의 근거는 무엇입니까?

다음 프로그램을 고려해 봅니다.이것으로 컴파일 오류가 발생합니까?

#include <stdio.h>
int s=5;
int s;
int main(void)
{
     printf("%d",s);
}

언뜻 보기에 컴파일러는 가변적인 재정의 오류를 줄 것 같지만 프로그램은 C 표준에 따라 완벽하게 유효합니다. (여기 http://ideone.com/Xyo5SY) 라이브 데모 참조).

잠정적인 정의는 스토리지 클래스 지정자와 초기화자가 없는 모든 외부 데이터 선언입니다.

C99 6.9.2/2

이니셜라이저 없이 fi틀 범위를 가지며, 스토리지 클래스 지정자가 없거나 스토리지 클래스 지정자가 정적인 개체에 대한 식별자 선언은 잠정적인 디fi네이션을 구성합니다.번역 단위가 식별자 fi에 대한 하나 이상의 잠정적인 fi을 포함하고, 번역 단위가 해당 식별자에 대한 외부적인 fi을 포함하지 않는 경우, 그 동작은 정확히 번역 단위가 그 식별자 fi의 fi 범위 선언을 포함하는 것과 같고, 번역 단위의 끝 현재의 복합형,0과 같은 이니셜라이저를 사용합니다.

제 질문은, 잠정적인 정의를 허용하는 근거가 무엇인가 하는 것입니다.C에서 이것을 사용하는 것이 있습니까?C는 왜 잠정적인 정의를 허용합니까?

잠정적인 정의는 C89 이전에 존재했던 호환되지 않는 모델을 연결하기 위한 방법으로 만들어졌습니다.이 내용은 C99 이론적 근거 섹션에서 다룹니다.6.9.2외부 개체 정의:

C90 이전의 구현은 내부 연계성이 있는 순방향 참조 식별자와 관련하여 매우 다양했습니다( §6.2.2 참조).C89 위원회는 이러한 상황을 처리하기 위해 잠정적인 정의의 개념을 고안했습니다.잠정적인 정의는 정의로 작용할 수도 있고 그렇지 않을 수도 있는 선언입니다.번역 단위에서 실제 정의가 나중에 발견되면 잠정적 정의는 선언으로 작동합니다.그렇지 않은 경우, 잠정적 정의는 실제 정의로 작용합니다.일관성을 위해 외부 연관성이 있는 식별자에 대해서는 동일한 규칙이 적용되지만 엄격하게 필요한 것은 아닙니다.

섹션을6.2.2C99의 이론적 근거에 따르면 다음과 같습니다.

외부 연계성이 있는 객체에 사용할 정의 모델은 C89 표준화의 주요 이슈였습니다.기본적인 문제는 개체의 어떤 선언이 개체에 대한 저장을 정의하고, 어떤 선언이 단지 기존 개체를 참조하는지를 결정하는 것이었습니다.이와 관련된 문제는 스토리지 정의가 여러 개 허용되는지 아니면 한 개만 허용되는지 여부였습니다.C89 이전의 구현은 최소 4가지 모델을 보여주며, 여기에 제한성을 증가시키는 순서로 나열되어 있습니다.

유용한 경우의 예는 다음과 같습니다.

void (*a)();

void bar();
void foo()
{
    a = bar;
}

static void (*a)() = foo;

/* ... code that uses a ... */

핵심은 다음과 같은 정의입니다.foo을 참조해야 합니다.a, 그리고 의 정의.a을 참조해야 합니다.foo 초기화된 구조와 유사한 예도 가능해야 합니다.

언급URL : https://stackoverflow.com/questions/33200738/what-is-the-rationale-behind-tentative-definitions-in-c

반응형