programing

max(a,b)는 stdlib.h에 정의되어 있습니까?

newstyles 2023. 10. 11. 20:32

max(a,b)는 stdlib.h에 정의되어 있습니까?

저는 두 대의 컴퓨터를 사용하고 있는데, 각각 다른 버전의 비주얼 스튜디오가 있습니다.비주얼 스튜디오 2008 컴퓨터에서 나의 코드는 컴파일됩니다. 2010 2010다를하기 때문에 max(a,b)제가 알기로는 stdlib.h에 정의되어 있습니다.다를 할 수 .max(a,b)2008년 컴퓨터에서 재정의될 것이기 때문입니다.하지만 내가 정의하지 않는다면,max(a,b)제 코드는 비주얼 2010 컴퓨터에서 컴파일되지 않습니다.

해결책이 있습니까?

의 C라는 의 C max그것의 표준 헤더는 상상을 초월할 정도로 깨져 있습니다.해야 할 수 있는 다입니다.#undef max시스템 헤더를 포함한 후 그리고 자신의 헤더/코드 앞에 (그리고 이 매크로가 정의하는 다른 문제가 있는 매크로).

다른 은 모두 를 .#ifndef max ... #endif. 이것은 좋은 생각이 아닙니다.정의하기max시스템 헤더는 구현자가 무능했다는 표시이며, 특정 버전의 환경에 잘못된 매크로가 있을 수 있습니다(예를 들어 괄호가 있는 인수를 제대로 보호하지 않는 매크로).max를) 잘못 중인 매크로minmax평생 한 번쯤은!)으로.#undef그리고 안전합니다.

는.stdlib.h정의를 내리다max은 응용 에 의한 즉 C /입니다에 대해 입니다.여기에는 아주 좋은 이유가 있습니다.응용 프로그램에서 사용되는 변수/함수 이름과 충돌할 수 있는 매크로 이름을 시스템 헤더에 정의하는 것은 위험합니다.가장 좋은 경우에는 명백한 원인을 가진 컴파일 시간 오류로 이어지지만, 다른 경우에는 디버깅하기 어려운 매우 이상한 동작을 일으킬 수 있습니다.어떤 경우든 휴대용 코드를 작성하는 것은 매우 어렵습니다. 왜냐하면 도서관에서 이미 어떤 이름을 사용할지 알 수 없기 때문입니다.

그래서 당신의 주요 질문에 답을 합니다.

max(a,b)는 stdlib.h에 정의되어 있습니까?

아닙니다. 187번 선을 중심으로 windef.h에 정의되어 있습니다.

#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */

로 보호합니다.#ifndef.

#ifndef max
    #define max(a,b) ((a) > (b) ? (a) : (b))
#endif

위 버전은 인라인 기능처럼 안전하지 않습니다.max(a++,b--)예상치 못한 결과를 초래합니다.

조건 컴파일을 사용할 수 있습니다.

#ifndef max
  #define max(a,b) ...
#endif

Visual C++의 경우#define NOMINMAX표준 헤더를 포함하기 전에 매크로를 얻을 수 없습니다.max아니면min.

언급URL : https://stackoverflow.com/questions/4234004/is-maxa-b-defined-in-stdlib-h-or-not