2010-08-22 4 views
3

일부 코드 샘플을 읽었으며 const int를 반환했습니다. 예제 코드를 컴파일하려고 할 때 충돌하는 반환 유형에 관한 오류가 발생했습니다. 그래서 const가 문제라고 생각하면서 검색을 시작했습니다. 코드를 제거하면 코드가 제대로 작동하고 컴파일되었을뿐만 아니라 예상대로 작동했습니다. 하지만 const 반환 형식에 관련된 정보를 찾을 수 없었습니다 (구조체/매개 변수/등등에 대해서만했지만 반환 형식에는 해당하지 않았습니다). 그래서 const가 무엇을 할 수 있는지 보여주기 위해 코드를 작성하려고했습니다.C에서의 Const 반환 유형

#include <stdio.h> 

int main() { 
    printf("%i", method()); 
} 

const int method() { 
    return 5; 
} 

그리고 나는이를 컴파일 할 때, 내가 얻을 : 나는 const를 제거 할 때마다

$ gcc first.c 
first.c:7: error: conflicting types for ‘method’ 
first.c:4: note: previous implicit declaration of ‘method’ was here 

그러나, 그것은 예상대로, 단순히 5 밖으로 인쇄하는 계속을 나는이 함께했다 인생과 함께. 그래서, 반환 유형으로 사용될 때 const가 무엇을 의미한다고 가정 할 수 있습니까? 고맙습니다.

+1

이 예제에서는 문제가 다르다. 선언되기 전에'method()'를 사용하므로 암시 적으로'int'를 반환한다고 가정합니다. 이 데이트 된 행동에 의존하는 것은 다소 나쁜 생각입니다. 예제를 변경하여'method()'를 선언하여 'const int'를 반환하여 더 대표적으로 만드십시오. 다시 말해서, 여러분이 여기있는 것은'const'와'nonconst' 타입 사이의 표준적인 충돌이며,'const' 타입이 함수에 의해 리턴 된 타입이라는 사실은 부적합합니다. –

+0

gcc에 -ansi-pedantic 옵션이 있습니까? 새 코드에서는 필수 요소 여야합니다. –

+0

Meta-pedantic :'-ansi'와'-pedantic'은 별도의 옵션입니다. – dirkgently

답변

4

호출하기 전에 method() 프로토 타입을 추가하면 오류가 수정됩니다.

const int method(); 
int main() { 
    printf("%i", method()); 
} 

Line 7: error: conflicting types for 'method' 

이 오류는 const int가 아닌 다른 반환 형식 (아마 INT)와 (그것을 발견하지 않았기 때문에) method()가 컴파일러에 의해 생성 된 것을 우리에게 알려줍니다

.

Line 4: error: previous implicit declaration of 'method' was here 

이 다른 오류는 실제로 컴파일러가 method의 자체 버전을 만들었다 고 알려줍니다.

+0

그래, 효과가 있었다. 고맙습니다. 나는 그들이 사용 된 곳 아래에 방법이있을 때 GCC가 그것을 만들었다는 것을 결코 깨닫지 못했다. 나는 그것이 헤더 파일이 일반적으로 소스에 포함되어있는 또 다른 이유라고 생각합니다 ... 고마워요. –

+1

통화 전에 프로토 타입을 추가하지 않았습니다. 그것은 프로토 타입이없는 선언입니다. –

+5

다음과 같아야합니다 : const int method (void); const가 아닌 int 메소드(); ? –

2

main은 프로토 타입없이 method()의 사용을보고 있으므로 int를 반환한다고 가정합니다. 그런 다음 const int을 반환한다고 선언합니다. method()의 선언을 main 앞에 놓거나 main 앞에 프로토 타입을 넣으십시오.

5

C는 함수의 이름, 반환 유형, const-ness 및 인수에 대해 C에게 충분히 알리기 전에 함수의 반환 형식을 추측합니다. 그러한 추측이 잘못되면 오류가 발생합니다. 이 경우 그들은 잘못되었습니다. 프로토 타입을 사용하거나 호출 위에 함수를 이동하십시오. 아, 그리고 CONST 다움에 대한

는 : 이 같은 매개 변수를 다시 호출하면 함수의 값이 동일 할 것, 어떤 (중요한) 부작용이 없어야한다는 것을 의미한다. 이는 최적화에 유용하며 컴파일러가 매개 변수에 대해 시행 할 수 있다는 다큐멘터리를 만듭니다. 함수는 상수를 변경하지 않을 것을 약속하고 컴파일러는이를 방지 할 수 있습니다.

+1

const 정규화 된 반환 형식은 함수가 순수한 동작을 나타내며 동일한 입력 값에 대해 동일한 반환 값을 생성한다는 것을 나타내는 참조를 제공 할 수 있습니까? 나는 그것에 대해 들어 본 적이 없다. –

+2

http://www.ohse.de/uwe/articles/gcc-attributes.html#func-const 틀림없이 이것은 표준이 아닌 GNU 문서이지만 꼭 읽어야합니다. 볼랜드의 C++ 컴파일러와 함께 나온 책에서 윈도우가 필수적으로 나오기 전에 그것을 배웠습니다. – Ian

+3

+1은 반환 값에 대한 실제'const' 해석을 언급합니다. gcc를 사용할 때'__attribute__ ((const))'와'__attribute__ ((pure))'를 더 잘 사용해야한다고 언급 했어야 만합니다. 더 명백한 imho입니다. –

4

게시 한 코드에 정의되지 않은 식별자가 있어야합니다 (최소한 method). 함수를 호출하기 전에 범위에 선언이 필요합니다. 더 나은 사용 :

#include <stdio.h> 

const int method() { 
    return 5; 
} 

int main() { 
    printf("%i", method()); 
} 

정의도 선언입니다. 따라서이 오류가 수정되어야합니다.

+0

고맙습니다. 저는 그 프로토 타입을 그곳에 올려 놓았습니다. 문제가 해결되었습니다. –

+0

gcc에서 사용할 수있는 좋은 옵션은'-Wall -ansi -pedantic -std = c99'입니다. GCC의 문서에서도 다른 것들을 찾아보십시오. – dirkgently

+2

@dirkgently :'-ansi'는'-std = c89'와 동일합니다.'-std = c99'와 함께 사용하는 것은 의미가 없습니다. –

18

const은 반환 값이 어떤 경우에도 개의 값이기 때문에 아무런 의미가 없으며 수정할 수 없습니다.당신이 얻고있는 오류는 암시 적으로 int이 아니라 const int이 아니라고 가정하기 때문에 함수가 선언되기 전에 함수를 사용한다는 사실에서 유래합니다. 그러나 실제로 메서드가 정의되면 반환 유형이 원래의 가정과 일치하지 않습니다. 예를 들어 int 대신 double을 반환하는 경우 정확히 동일한 오류가 발생합니다.

예컨대 :

#include <stdio.h> 

int main() { 
    printf("%i", method()); 
} 

double method() { 
    return 5; 
} 

를 생성 :

$ gcc -std=c99 -Wall -Wextra -pedantic impl.c 
impl.c: In function ‘main’: 
impl.c:4: warning: implicit declaration of function ‘method’ 
impl.c: At top level: 
impl.c:7: error: conflicting types for ‘method’ 
impl.c:4: note: previous implicit declaration of ‘method’ was here 

는 최대 경고 수준을 설정하는 것이 얼마나 도움하세요!