printf() 를 사용하는 데 #include가 필요 하지 않은 이유는 무엇입니까?
세션 녹취록:
> type lookma.c
int main() {
printf("%s", "no stdio.h");
}
> cl lookma.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
lookma.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
/out:lookma.exe
lookma.obj
> lookma
no stdio.h
당신은 원래 이 C++에 태그를 달았지만 C 프로그램으로 보입니다.범위에 프로토타입이 없는 경우(예: #include <stdio>의 누락으로 인해) C는 함수에 대한 암시적 선언을 자동으로 제공합니다.h>암묵적 선언은 다음과 같습니다.
int printf();
printf는 int를 반환하는 함수이며 인수의 수에 상관없이 사용할 수 있음을 의미합니다.이 프로토타입은 당신의 전화를 위해 우연히 작동했습니다.#<stdio.h>를 포함해야 합니다.
마지막으로, 현재의 C 표준(ISO/IEC 9899:1999 또는 구어적으로 "C99")은 암묵적인 선언을 허용하지 않으며, 이 프로그램은 적합하지 않을 것임을 덧붙여야 합니다.암시적 선언이 제거되었습니다.당신의 컴파일러는 C99를 지원하지 않는다고 생각합니다.C++도 정확한 프로토타입이 필요하며 암묵적인 선언을 하지 않습니다.
엄격한 준수 모드(즉, "이론상"을 의미)에서는 범위에 있는 함수의 프로토타입 선언 없이 변수 개수의 인수를 사용하는 함수를 호출할 때 정의되지 않은 동작(나쁨)을 호출합니다.이것은 컴파일러가 다음을 사용하는 프로그램으로 자신이 좋아하는 것은 무엇이든 할 수 있다는 것을 의미합니다.printf()의 견본 없이#include <stdio.h>또는 이와 동등한 선언을 할 수 있습니다."마음에 드는 모든 것"은 옵션 중 하나로 올바르게 작동하는 것을 포함합니다. 예에서 선택한 옵션인 것 같습니다.
실제로 코드는 공식적인 선언 없이도 대부분의 실용적인 컴파일러에서 정상적으로 작동할 것입니다.printf()기능.
qrdl이 지적한 것처럼, C 컴파일러가 C 라이브러리와 연동하기 때문에 함수가 발견되었습니다.
C99와 '묵시적 int'에 대한 Chris Young의 언급은 정확하지만, '변수 인수 함수는 범위에 프로토타입이 있어야 한다'에 대한 규칙은 C89와 C99 모두에 적용됩니다.대부분의 컴파일러는 기본적으로 엄격한 C99 호환 모드에서 작동하지 않습니다. 그렇게 컴파일되지 않는 코드가 너무 많기 때문입니다.
Chris Young은 다음과 같이 언급했습니다.
명확하게 설명하자면, 제 의견은 암묵적인 선언을 삭제하는 C99에 관한 것이었습니다."implicit int"라고 말함으로써, 저는 당신이 foo(void); intoo(void); intoo(void); C99와 같은 선언을 허용하는 C89 기능을 말하는 것이라고 생각합니다.
크리스는 물론 맞습니다.C99 표준에서 제거된 두 가지 '암시적 선언' 기능이 있습니다.표준의 서문에는 다음과 같이 나와 있습니다.
- 은연중에 지워 버리다
int - 암시적 함수 선언 제거
저는 충분히 명확하게 생각하고 있지 않았습니다.그럼에도 불구하고, C89와 C99 둘 다 가변 수의 인수를 취하는 함수들의 범위에 대한 프로토타입이 필요합니다.
설명하기:
extern int pqr();
int main(void)
{
int i = pqr(1, 3);
return i;
}
첫 번째 줄이 없으면 함수의 암시적 선언이 있는 올바른 C89 조각입니다.pqr()정수(지정되지 않은 인수 포함)를 반환하는 함수로서.첫번째 줄이 교체된 경우extern pqr();, 그렇다면 이것은 명백한 선언을 가진 정확한 C89 조각입니다.pqr()정수(지정되지 않은 인수 포함)를 반환하는 함수로서, 그러나 반환 유형은 'int'. 작성된 바와 같이 함수는 명시적으로 선언되며 명시적입니다.intreturn type - 그러나 여전히 지정되지 않은 인수가 있습니다.나는 그것이 비록 완전히 바람직한 것은 아니지만 유효한 C99라고 믿습니다.확실히 GCC(3.4.4)는 옵션으로 이를 받아들입니다.-std=c99 -pedantic". 이상적으로, 함수 선언에는 전체 프로토타입이 포함되어야 합니다.(그리고, 만약pqr()타원으로 정의되었으며, 이론적으로 프로토타입이 필요합니다!)
printf()는 표준 C 라이브러리에 위치하고 있으며 링커는 항상 표준 라이브러리를 실행 파일에 링크하므로 표준 함수를 찾을 수 있고 링크 문제는 없습니다.
C 컴파일러는 프로토타입이 없는 함수가 반환된다고 가정하기 때문에 적절한 헤더를 포함하지 않으면 프로토타입이 되지 않은 함수를 사용하여 문제를 초래할 수 있습니다.int변수 개수의 인수를 사용합니다.그러니 항상 머리말을 포함시키세요 - 그것은 당신의 안전한 울타리입니다.
언급URL : https://stackoverflow.com/questions/336814/why-is-include-stdio-h-not-required-to-use-printf
'programing' 카테고리의 다른 글
| 봄 :: 히카리 1조 출발...응용 프로그램을 실행할 때 이 줄에 걸려 버립니다. (0) | 2023.11.05 |
|---|---|
| 조건을 복제하면 다른 결과 집합이 나타납니다. (0) | 2023.11.05 |
| 어떻게 요일과 일년의 달을 얻을 수 있습니까? (0) | 2023.11.05 |
| 기본 dict를 dict로 변환하는 방법? (0) | 2023.11.05 |
| jQuery - 요소 내부에서 요소 선택 (0) | 2023.10.31 |