다음 함수 선언 및 정의를 고려하십시오. 소스 파일에서Visual Studio의 C4028 경고 (선언과 다른 형식 매개 변수)가 가짜입니까?
void some_function(int param);
: 헤더 파일에서
#include "test.h"
void some_function(const int param) {}
int main(void) {
return 0;
}
비주얼 스튜디오 2010에서, 순수 C 프로젝트로 컴파일, 나는 warning C4028: formal parameter 1 different from declaration
를 참조하십시오. 그러나 내가 아는 한, 이것은 완벽하게 유효한 C이며 상당히 일반적인 관행입니다.
나는 이것에 관해 틀렸고, VS2010 따라서 나에게 경고하는 것이 맞습니까? 또는 위조 된 경고 인 경우 이러한 유형의 경우에 특별히 해제 할 수 있습니까? 그러나 일치하지 않는 매개 변수 유형의 실제 사례에 대한 경고는 계속 유지해야합니까?
(VS2010와 함께 제공되는 실제 컴파일러는 다음과 같습니다 마이크로 소프트 (R) 32 비트 C/C++ 최적화 컴파일러 버전 16.00.30319.01는 80X86에 대한 나의 명령 행은 단순히 cl test.c
입니다..)
흥미 롭습니다. "일반적인 관행"에서 이것을 어디에서 보았습니까? 그리고 네, 경고하는 것이 옳습니다.이 경우에는 값 매개 변수부터 핥아도 상관 없으며, 구현 측면에서 부팅하는 것이 더 중요합니다. * 포인터 *를 사용하면 큰 차이를 만들 수 있습니다. 예 : 구현시 * prototype * 및'char *'에있는'const char * '의 파생을 고려하십시오. – WhozCraig
@WhozCraig - 포인터 매개 변수와 같은 것은'const char * param'이 아니라'char * const param'이됩니다. – detly
@WhozCraig -하지만 그래, 그건 중요하지 않다는 것을 안다. 그것이 내 요점이다. 이것은 컴파일러와 개발자에게'param'은 함수 본문에 의해 변경 될 수 없다는 것을 알려주는데, 이는 선언에서 노출 될 필요가없는 구현 세부 사항입니다. 그렇다면 VS2010은 비 호환성, 동작의 차이 및 예기치 않은 동작의 가능성이 없을 때 경고를 발행하는 이유는 무엇입니까? – detly