재정의는 C에서는 허용되지만 C++에서는 허용되지 않습니까?
이 코드는 C에서는 작동하지만 C++에서는 작동하지 않는 이유는 무엇입니까?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
잠정적 정의는 C에서는 허용되지만 C++에서는 허용되지 않습니다.
잠정적인 정의는 스토리지 클래스 지정자와 초기화자가 없는 모든 외부 데이터 선언입니다.
C99 6.9.2/2
이니셜라이저 없이 fi틀 범위를 가지며, 스토리지 클래스 지정자가 없거나 스토리지 클래스 지정자가 정적인 개체에 대한 식별자 선언은 잠정적인 디fi네이션을 구성합니다.번역 단위가 식별자 fi에 대한 하나 이상의 잠정적인 fi을 포함하고, 번역 단위가 해당 식별자에 대한 외부적인 fi을 포함하지 않는 경우, 그 동작은 정확히 번역 단위가 그 식별자 fi의 fi 범위 선언을 포함하는 것과 같고, 번역 단위의 끝 현재의 복합형,0과 같은 이니셜라이저를 사용합니다.
그렇게int i
는 잠정적인 정의입니다.C 컴파일러는 모든 잠정적인 정의를 하나의 정의로 결합할 것입니다.i
.
C++에서 코드가 하나의 정의 규칙으로 인해 잘못된 형식입니다(섹션 3.2/1 ISO C++).
변환 단위는 변수, 함수, 클래스 유형, 열거형 또는 템플릿에 대한 정의를 두 개 이상 포함할 수 없습니다.
// 하지만 만약 내가 글을 쓴다면,
int i = 5;
또 C에서도 오류가 납니다.
왜냐하면 이 경우 초기화자 (5) 때문에 더 이상 잠정적인 정의로 남아있지 않기 때문입니다.
단지 정보를 얻기 위해
J.5.11 다중 외부 정의
키워드 외부를 명시적으로 사용하든 사용하지 않든 개체의 식별자에 대한 외부 정의가 둘 이상 있을 수 있습니다. 정의가 일치하지 않거나 둘 이상이 초기화되면 동작이 정의되지 않습니다(6.9.2).
그것은 잠정적인 정의라고 불립니다.C에서만 가능합니다.
잠정적인 정의는 스토리지 클래스 지정자와 초기화자가 없는 모든 외부 데이터 선언입니다.변환 단위의 끝에 도달하고 식별자에 대한 이니셜라이저가 있는 정의가 나타나지 않으면 잠정적인 정의가 전체 정의가 됩니다.이런 상황에서 컴파일러는 정의된 개체에 대해 초기화되지 않은 공간을 예약합니다.
다음 문장은 정상적인 정의와 잠정적인 정의를 보여줍니다.
int i1 = 10; /* definition, external linkage */
static int i2 = 20; /* definition, internal linkage */
extern int i3 = 30; /* definition, external linkage */
int i4; /* tentative definition, external linkage */
static int i5; /* tentative definition, internal linkage */
int i1; /* valid tentative definition */
int i2; /* not legal, linkage disagreement with previous */
int i3; /* valid tentative definition */
int i4; /* valid tentative definition */
int i5; /* not legal, linkage disagreement with previous */
C++는 임시 정의의 개념을 지원하지 않습니다. 스토리지 클래스 지정자가 없는 외부 데이터 선언은 항상 정의입니다.
여기서부터:잠정적 정의
잠정적인 정의를 더 잘 이해하려면 다음 과정을 거칩니다.
언급URL : https://stackoverflow.com/questions/5337370/redefinition-allowed-in-c-but-not-in-c
'programing' 카테고리의 다른 글
XPath를 사용하여 특성 가져오기 (0) | 2023.10.22 |
---|---|
unix:/var/run/docker.sock에서 도커 데몬에 연결할 수 없습니다.도커 데몬이 실행 중입니까? (0) | 2023.10.22 |
맵 또는 집합을 얕은 클론 (0) | 2023.10.22 |
유형 캐스팅에 추가 CPU 주기가 소모됩니까? (0) | 2023.10.22 |
Reference from UITableViewCell to parent UITableView? (0) | 2023.10.22 |