stdio.h source 헤더파일



왜#include<stdio.h>는 printf()를 사용할 필요가 없습니까? (2)

엄격한 준수 모드 (즉, "이론적으로"를 의미)에서는 범위에있는 함수의 프로토 타입 선언없이 가변 인수를 취하는 함수를 호출 할 때 정의되지 않은 동작 (잘못된 것)을 호출합니다. 이는 컴파일러가 #include <stdio.h> 의 프로토 타입 또는 이와 동등한 선언없이 printf() 를 사용하는 프로그램에서 원하는 모든 작업을 수행 할 수 있음을 의미합니다. "좋아하는 것"에는 옵션 중 하나로 올바르게 작동하는 것이 포함됩니다. 그것은 당신의 예제에 의해 선택된 옵션 인 것 같습니다.

실제로이 코드는 printf() 함수의 공식 선언 없이도 대부분의 실제 컴파일러에서 정상적으로 작동합니다.

qrdl에 의해 지적 되었 듯이, C 컴파일러가 C 라이브러리와 링크되기 때문에 함수가 발견되었습니다.

C99와 'implicit int'에 대한 Chris Young의 의견은 정확하지만 '가변 인수 함수에 대한 규칙은 반드시 범위의 프로토 타입이 있어야합니다'라는 말은 C89와 C99에 모두 적용됩니다. 대부분의 컴파일러는 컴파일하지 않는 코드가 너무 많아서 기본적으로 엄격한 C99 호환성 모드에서 작동하지 않습니다.

Chris Young은 다음과 같이 주석을 달았습니다.

명확히하기 위해 내 의견은 암시 적 선언을 제거하는 C99에 관한 것이 었습니다. "implicit int"라고 말하면 foo (void)와 같은 선언을 허용하는 C89 기능을 언급하는 것입니다. int foo (void);를 의미하기 위해 C99도 삭제되었습니다.

물론 Chris는 맞습니다. C99 표준에서 제거 된 두 가지 '암시 적 선언'기능이있었습니다. 표준 서문은 다음과 같이 나열합니다.

  • 암묵적인 int 제거한다.
  • 암시 적 함수 선언 제거

나는 충분히 명확하게 생각하지 않았다. 그럼에도 불구하고 C89와 C99는 다양한 인수를 취하는 함수의 범위에서 프로토 타입을 요구합니다.

설명하기 :

extern int pqr();
int main(void)
{
    int i = pqr(1, 3);
    return i;
}

첫 번째 라인이 없다면 이것은 pqr() 함수의 암시 적 선언이있는 정수 (지정되지 않은 인수가있는)를 반환하는 올바른 C89 프래그먼트입니다. 첫번째 줄이 extern pqr(); 로 대체되면 extern pqr(); , 이것은 pqr() 을 명시 적으로 선언 한 정확한 C89 프래그먼트이며 (지정되지 않은 인수로) 정수를 반환하는 함수로 반환 유형이 '암시 적 int '입니다. 작성된 것처럼이 함수는 명시 적으로 선언되고 명시 적 int 반환 유형을 갖지만 아직 명시되지 않은 인수가 있습니다. 나는 그것이 C99가 타당하다고 생각하지는 않지만 타당하다고 믿습니다. 이상적으로, GCC (3.4.4)는 ' -std=c99 -pedantic '옵션을 사용하여이를 받아 들인다. 이상적으로, 함수 선언은 전체 프로토 타입을 포함해야한다. (그리고 pqr() 가 줄임표로 정의 되었다면, 프로토 타입이 필요할 것이다. 이론적으로는 !)

https://ffff65535.com

세션 성적 :

>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.h> 생략) C는 자동으로 함수에 대한 암시 적 선언을 제공합니다. 암시 적 선언은 다음과 같습니다.

int printf();

printf는 int를 반환하고 임의의 수의 인수를 취할 수있는 함수라는 것을 의미합니다. 이 프로토 타입은 당신의 전화를 위해 일했습니다. #include <stdio.h>

마지막으로, 현재 C 표준 (ISO / IEC 9899 : 1999 또는 구어체로 "C99")이 암시 적 선언을 허용하지 않으며이 프로그램이 적합하지 않다고 추가해야합니다. 암시 적 선언이 제거되었습니다. 나는 당신의 컴파일러가 C99를 지원하지 않는다고 생각한다. C ++은 또한 올바른 프로토 타입을 요구하며 암시적인 선언을하지 않습니다.





declaration