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
를) 잘못 중인 매크로min
max
평생 한 번쯤은!)으로.#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
'programing' 카테고리의 다른 글
표의 일부분을 별도의 워크시트에 표시 (0) | 2023.10.11 |
---|---|
python에서 파일 이름을 가져오는 방법은 숫자로 시작합니다. (0) | 2023.10.11 |
왜 wprintf는 리눅스에서 유니코드의 러시아어 텍스트를 라틴어로 번역합니까? (0) | 2023.10.06 |
asp.net 웹사이트에서 쿠키 값을 얻는 방법 (0) | 2023.10.06 |
Javascript/jQuery를 사용하여 HTML 요소에서 모든 특성 가져오기 (0) | 2023.10.06 |