C의 암묵적 함수 선언
함수의 암묵적 선언이라는 용어는 무엇을 의미합니까?적절한 헤더 파일을 포함하지 않고 표준 라이브러리 기능을 호출하면 다음과 같은 경고가 발생합니다.
int main(){
printf("How is this not an error?");
return 0;
}
에러라고 선언하지 않고 함수를 사용하면 안 되는 것 아닌가요?자세히 설명해 주세요.이 사이트를 검색해보니 비슷한 질문이 나왔지만 확실한 답을 찾을 수 없었습니다.대부분의 답변에서는 경고를 없애기 위해 헤더 파일을 포함시키는 것에 대해 언급하고 있습니다만, 어떻게 이것이 오류가 아닌지 알고 싶습니다.
그것은 오류로 간주되어야 한다.【C】【C】
「」를 한 컴파일-Werror는 이 (gcc)는 이 문제를 해결합니다.
C는 선언을 찾지 못한 경우 다음과 같은 암묵적인 선언을 가정합니다.int f();즉, 함수는 사용자가 지정한 모든 것을 수신할 수 있으며 정수를 반환합니다.이 충분히 경우(및 「」의 )printf된다,, 된다 된다, 된다.경우에 따라서는(예를 들어 함수가 실제로 포인터를 반환하고 포인터가 ints보다 큰 경우) 실제 문제를 일으킬 수 있습니다.
C는 C99, C11이다.이러한 표준에서는, 이것은 에러입니다. ★★★★★★★★★★★★★★.gcc는 기본적으로 이러한 표준을 구현하지 않으므로 경고 메시지가 계속 표시됩니다.
암묵적 선언은 C에서 사용할 수 없습니다.
C99 에서는 이 기능이 삭제되었습니다(C89 에 있습니다).
gcc만 발행하도록 합니다.-std=c99그러나 컴파일러는 이러한 프로그램의 번역을 거부할 권리가 있습니다.
그림을 완성하려면-Werror '침습적될 수 있습니다.
gcc(및 llvm)의 경우 다음 옵션을 사용하여 오류 시 이 경고만 변환하는 것이 보다 정확한 솔루션입니다.
-Werror=implicit-function-declaration
하나의 gcc 경고를 오류로 만들기를 참조하십시오.
「 」의 인 -Werror를 사용하는 , 제작 속도가 수 물론 경고 없는 코드를 사용하는 것이 좋지만, 개발 단계에 따라 시제품 제작 속도가 느려질 수 있습니다.
C의로 함수는 C의 있는 됩니다.int function(int arg1, int arg2, int arg3, etc).
요: 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.int논의에 사용할 수 있습니다.이치노 아마...int ★★★double또는char*. 프로토타입을 사용하지 않으면 컴파일러는 인수의 크기를 불문하고 전달되며 호출되는 함수는 올바른 인수 유형을 사용하여 수신하는 것이 좋습니다.
상세한 것에 대하여는, 참조해 주세요.K&R C.
C는 매우 낮은 수준의 언어이므로 생각할 수 있는 거의 모든 법적 객체(.o) 파일을 만들 수 있습니다.C는 기본적으로 차려입은 어셈블리 언어라고 생각해야 합니다.
특히 C는 함수를 사용하기 전에 선언할 필요가 없습니다.함수를 선언하지 않고 호출하면 함수의 사용은 함수의 (암묵적인) 선언이 됩니다.방금 실행한 간단한 테스트에서는 printf와 같은 내장 라이브러리 함수(최소한 GCC)의 경우 경고에 불과하지만 랜덤 함수의 경우 정상적으로 컴파일됩니다.
물론 링크를 시도해도 foo를 찾을 수 없으면 오류가 발생합니다.
printf와 같은 라이브러리 함수의 경우 일부 컴파일러는 기본 유형 체크를 수행할 수 있도록 내장 선언을 포함하므로 (사용 시) 암묵 선언이 내장 선언과 일치하지 않으면 경고가 표시됩니다.
암묵적으로 선언된 함수는 프로토타입도 정의도 없지만 코드 어딘가에서 호출되는 함수입니다.그렇기 때문에 컴파일러는 이것이 함수의 의도된 사용법인지 확인할 수 없습니다(인수의 수와 유형이 일치하는지 여부).참조는 컴파일 후 링크 타임(다른 모든 글로벌 기호와 마찬가지로)에 해결되므로 기술적으로 프로토타입을 건너뛰어도 문제가 없습니다.
프로그래머는 자신이 무엇을 하고 있는지 알고 있으며 이것이 프로토타입을 제공하는 정식 계약이 생략된 전제가 된다고 가정합니다.
잘못된 유형 또는 카운트의 인수를 사용하여 함수를 호출할 경우 심각한 오류가 발생할 수 있습니다.가장 가능성이 높은 것은 스택의 파손입니다.
오늘날에는 이 기능이 애매한 기묘한 것으로 보일 수 있지만, 옛날에는 포함된 헤더 파일의 수를 줄이는 방법이었기 때문에 컴파일 속도가 빨라졌습니다.
언급URL : https://stackoverflow.com/questions/9182763/implicit-function-declarations-in-c
'source' 카테고리의 다른 글
| 클래스 JavaLaunchHelper는 양쪽에서 구현됩니다.libinstrument.dylib.둘 중 하나가 사용됩니다.정의되지 않은 것 (0) | 2022.07.23 |
|---|---|
| 파일명이 아닌 부모 디렉토리 이름만 언급하여 index.vue를 Import하는 방법 (0) | 2022.07.23 |
| Vuetify 필드에 비밀번호 문자 숨기기 (0) | 2022.07.23 |
| 구조 할당 또는 memcpy? (0) | 2022.07.23 |
| 컴파일러에서 8비트로 표시되는 부울 값.운영이 비효율적인가요? (0) | 2022.07.23 |