C에 대한 공통 배열 길이 매크로?
배열 길이에 대한 매크로가 여러 개 떠다니는 것을 보았습니다.
이 질문에서:
#define length(array) (sizeof(array)/sizeof(*(array)))#define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0]))#define SIZE(array, type) (sizeof(array) / (sizeof(type))
Visual Studio:
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
제가 알고 싶은 것은:
- 를 사용하는 것과 다른 점은 무엇입니까?
array[0]그리고.*array? - 왜 둘 중 하나가 선호되어야 합니까?
- 그들은 C++에서 다릅니까?
다음은 (구글 크롬 프로젝트에서) 더 나은 C 버전입니다.
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
보다 향상됩니다.array[0]또는*array버전: 사용)0[array]와 동등한.array[0]플레인 어레이에서, 그러나 컴파일에 실패합니다.array과부하가 걸리는 C++ 유형입니다.operator[]().
나눗셈은 포인터가 다음과 같이 전달되는 많은 (모든 것은 아니지만) 상황에 대해 (컴파일 시간 상수 식이기 때문에) 0으로 나누기 연산을 발생시킵니다.array매개 변수
C에 배열의 길이를 반환하는 표준 함수가 있습니까?를 참조하십시오.자세한 내용은
C++ 코드에 대한 더 나은 옵션이 있습니다.자세한 내용은 매크로를 사용하지 않고_array의 시간 크기 컴파일을 참조하십시오.
- array[0]와 *array를 사용하는 것의 차이점은 무엇입니까?
- 왜 둘 중 하나가 선호되어야 합니까?
- 그들은 C++에서 다릅니까?
C에 차이가 없습니다.C++의 실제 원시 배열에 대한 차이는 없습니다.
둘 중 하나를 선호할 기술적 근거는 없지만, 초보자는 포인터 참조 취소로 인해 혼동될 수 있습니다.
C++에서는 매크로가 매우 안전하지 않기 때문에 일반적으로 매크로를 사용하지 않습니다.실제 원시 배열 대신 포인터를 전달하면 코드가 컴파일되지만 잘못된 결과가 생성됩니다.따라서 C++에서는 대신 …과 같은 기능 템플릿을 사용해야 합니다.
#include <stddef.h>
typedef ptrdiff_t Size;
template< class Type, Size n >
Size countOf( Type (&)[n] ) { return n; }
이것은 실제 원시 배열만 인수로 허용합니다.
이것은 3가지 기능의 일부입니다.startOf,endOf그리고.countOf원시 어레이와 표준 라이브러리 컨테이너 모두에 적용할 수 있도록 정의하는 것이 매우 편리합니다.제가 알기로는 이 삼합회는 디트마 쿠엘에 의해 처음 확인되었습니다.C++0x에서startOf그리고.endOf아마 다음과 같이 사용할 수 있을 것입니다.std::begin그리고.std::end.
건배!
없음. 배열의 값은 첫 번째 요소에 대한 포인터입니다.*array == array[0]
아니요
이 매크로는 배열이 매개 변수로 함수에 전달되는 함수 내부에서 호출되면 작동하지 않습니다.이는 배열 개체가 딥 복사본이 아닌 포인터로 "붕괴"를 전달했기 때문입니다.
언급URL : https://stackoverflow.com/questions/4415524/common-array-length-macro-for-c
'source' 카테고리의 다른 글
| 이전에 배포한 Firebase 콘솔에서 코드 가져오기 (0) | 2023.06.06 |
|---|---|
| sys.stdout이 터미널에 연결되어 있는지 여부를 탐지하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
| #만약 스위프트 언어로 대체한다면, (0) | 2023.04.27 |
| 마이크로소프트.사무실. 인터럽트.Excel 참조를 찾을 수 없습니다. (0) | 2023.04.27 |
| WPF 사용자 제어의 로드된 이벤트가 두 번 이상 발생함 (0) | 2023.04.27 |