문제

나는 현재 C를 배우고 실험하고 있으며 사용 중입니다. Bloodshed의 Dev-C ++ IDE로서.

이제, 나는 다음 코드 조각 (포함되지 않거나 포함되지 않음)이 컴파일하고 실행된다는 것을 깨달았습니다.

main ()
{
    printf("%d", strlen("hello"));  
}

이제 실수하지 않으면이 소스에 두 개의 헤더 파일이 포함되어서는 안됩니까? stdio.h 그리고 string.h...하지만 보시다시피, 나는 그것들을 추가하지 않았으며 코드는 여전히 컴파일되어 성공적으로 실행되었습니다.

내 불만은 컴파일러가 "엄격한"것을 원한다는 것입니다. 왜냐하면 나는 여전히 C를 배우기 때문에 코드가 일반적으로 실행되지 않으면 코드가 실행되기를 원하지 않기 때문입니다.

따라서 Dev-C ++가 '실수를 수정하는 것을 막는 것을 방지하는 방법이 있습니까? includeS, 즉 더 일종의 "엄격한"것으로 만들까요?

도움이 되었습니까?

해결책

C90은 암시 적 함수 선언이라는 기능 (C99 및 C ++가없는)을 가졌습니다. 기능 호출에서 아직 선언되지 않은 이름을 사용했을 때 컴파일러는 마치 마치 다음과 같습니다.

extern int identifier();

보았습니다. 이 기능은 C99에서 삭제되었으며 대부분의 컴파일러는 C99가 공표되기 전에 이에 대해 경고 할 수있는 옵션이있었습니다.

C90에 머무를 때에도 이것을 사용하는 것이 권장되지 않습니다. 코드 사용을 유지해야하고 프로토 타입을 추가 할 수없는 경우 다음을 확인하십시오.

  • 함수는 int를 반환합니다 (Printf의 경우이지만 유효성은 strlen의 구현 종속으로 int 또는 다른 것일 수있는 size_t를 반환합니다).

  • 함수는 변수가 아닙니다 (Strlen의 경우는 그렇지 않지만 printf)

  • 인수 유형은 기본 인수 프로모션 (char, short, float)으로 수정되지 않으며 예상 유형이 무효 일 때 필요한 경우 void에 캐스트 포인터에주의를 기울여야합니다. 올바른 포인터 유형. (이것은 Variadic Arguments BTW에주의를 기울여야하는 것과 동일합니다).

이러한 조건이 충족되지 않고 코드의 전화를받지 않는 경우 정의되지 않은 행동 영역에 들어갑니다.

다른 팁

이것이 실제로 DEVC ++ 문제인지는 모르겠지만 어쨌든 당신은 그것을 버리는 것을 고려해야합니다. 더 이상 개발되지 않으며 매우 버그가 있습니다. 나는 변경하는 것이 좋습니다 코드 :: 블록, 이것은 모든면에서 더 좋으며 최신 GCC 컴파일러를 사용하도록합니다.

눈에 보이는 프로토 타입없이 변수 함수를 호출하는 경우 '정의되지 않은 동작'의 가능성 중 하나는 코드가 컴파일하고 성공적으로 실행된다는 것입니다.

GCC를 기본 컴파일러로 사용하는 경우 다음과 같은 플래그를 전달할 수 있어야합니다. -std=c89 -pedantic -Wall -Wextra 게시 한 스 니펫과 같은 코드에 대한 경고를 받으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top