2016-12-29 3 views
5

C++에서 변수를 여러 번 선언하면 컴파일하는 동안 오류가 표시됩니다. 예 :C++에서 함수 및 변수를 여러 번 선언하는 경우

int x; 
int x; 

함수를 여러 번 선언해도 컴파일하는 동안 오류가 표시되지 않습니다. 예를 들면 다음과 같습니다.

int add(int, int); 
int add(int, int); 

C++에서 이러한 차이점은 무엇입니까?

+0

함수가 오버로드 될 수 있지만 매개 변수의 수와 유형이 달라야합니다. 변수를 오버로드 할 수 없습니다. – nischalinn

+0

그것의 재 선언 만 과부하되지 않습니다. 선언은 언제든지 할 수 있습니다. – user1438832

+0

은 함수 선언이 아니며 여러 번 할 수있는 프로토 타입 선언입니다. 이것은 C 이후의 구별입니다. Prototype은 본문이없는 선언입니다. 선언 AND 본문은 정의로 간주됩니다. 한 번만 발생할 수 있습니다. – Swift

답변

12

int x;은 (단지) declaration이 아니며, definition입니다. 따라서 ODR이 위반되어 오류가 발생합니다. 즉, 하나의 번역 단위에서 하나의 정의 만 허용됩니다.

변수의 선언과 같이 쓸 수있다 : 한편으로 int add(int, int);

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

는 선언 (함수)을 정확하게한다. 하나의 번역 단위에서 여러 선언을해도 문제가 없으며 ODR이 위반되지 않습니다.

+1

계속 하시겠습니까? 'int add (int int)'선언이 정의가 아니므로 ODR이 적용되지 않습니다. – Peter

+0

설명 주셔서 감사합니다! 그것은 나의 의심에 대답한다. :) –

+0

헤더의 함수 선언은 종속성 관리에 매우 중요합니다 (기본적으로 "링크 타임에이 시그니처가있는 함수가 있어야한다고 가정 할 수 있습니다"). 이 선언은 동일한 선언을 가진 다른 헤더가 포함되면 쉽게 중복 될 수 있습니다. 그러나 변수의 중복 된 정의는 동일한 이름을 가진 무언가의 2 개의 다른 인스턴스를 의미하며 명확하게 구분할 방법은 없습니다. (따라서 허용되지 않습니다.) –

관련 문제