2016-10-21 9 views
2

(C에서)되지 선언이 항상 컴파일하고있다CONST 기능 프로토 타입의 매개 변수 만 C 코드를 쓸 때, 나는 종종 함수의 정의에서 함수 매개 변수 선언에서 <code>const</code> 있지만 선언을 포함

int func(int arg); 

... 

int func(int const arg) 
{ 
    return arg + 1; 
} 

을 나를 위해 GCC와 Clang을 사용하여 문제없이,하지만 마이크로 칩의 C18 컴파일러는 타입 불일치를 주장하고있다.

표준이 이에 대해 무엇을 말해야합니까? 비표준 확장 프로그램에 의존하고 있습니까?

편집 : 나는 이것의 이점에 대해 묻지 않고 C-++에 대해서 묻지 않을 것이다. 중복 된 질문 (Use of 'const' for function parameters)과 같다. 나는 C 표준에 대해 묻고있다 : 이것은 합법적 인 ANSI C, C99 또는 C11인가?

+0

표준이 맞는다고 생각합니다. 호환되는 유형과 관련이 있으며 실제로 올바른 참조를 찾을 수 있습니다. –

+0

사실,이 질문은 중복되지 않습니다. 나는 당신이 그것을 더주의 깊게 다시 읽고 다시 여길 것을 제안합니다. – glauxosdever

+0

주세요. C++에 대해 묻지 않고이 스타일의 찬반 양론에 대해 묻지 않습니다. 나는 C 표준에 대해 묻고있다. – thetic

답변

3

참조 C11 6.7.6.3/15, 함수 원형의 호환성 이야기 :

형 적합성을 결정하는 데

및 복합 형 함수 또는 어레이 형으로 선언 된 각 매개 변수를 갖는 것으로 취해진 다 한정 유형으로 선언 된 각 매개 변수는 선언 된 유형의 규정되지 않은 버전을 갖는 것으로 간주됩니다.

이것은 정의가 프로토 타입과 호환 가능함을 지정합니다. "수혜 자격"이란 최상위 수준 인 const 또는 volatile을 나타냅니다.

+0

C89 또는 C99와 다를 지 모르지만 내 평소 스테이션이 아닌지 확인하십시오. –

+1

C99에서 섹션 번호는 다릅니다 (§6.7.5.3). 그러나 문구는 거의 동일합니다. C90에서 섹션 번호는 다시 다릅니다 (§6.5.4.3), 표현이 더 간단합니다. _ (함수 또는 배열 유형이있는 으로 선언 된 각 매개 변수의 경우 해당 비교 유형은 6.7.1에서와 같이 을 포인터 유형으로 변환 한 결과입니다.) 선언 된 각 매개 변수 한정 유형 인 경우 비교 유형은 해당 유형의 정규화되지 않은 버전입니다.) _ –

+0

예, * 유형 호환성 *이 정의됩니다. 그러나 정의와 프로토 타입 사이의 기계 가공은 * 유형 호환성 *에 기반한다고 어디에서 말합니까? (말하자면, 모든 매개 변수 유형의 정확한 일치를 요구하는 것과는 대조적으로). 내 말은, 유형 호환성에 기반하고 있다고 확신합니다. 단지 이러한 개념을 연결하는 위치를 기억하지 못합니다. – AnT

0

이 유형의 오류는 다양한 유형의 컴파일러에서 발생했다고 생각합니다. 그래서 C18 컴파일러 검사 함수 선언은 & 정의이지만 다른 것은 그렇지 않습니다. 그리고 C/CPP 플랫폼 의존적 인 프로그래밍 언어.