다른 컴파일러에서 MSVC의 _count of와 동등합니까?
다른 컴파일러, 특히 GCC와 Clang에서 제공하는 것과 동등한 기본 제공물이 있습니까?매크로가 아닌 양식이 있습니까?
C++11을 사용하는 비 매크로 형식은 다음과 같습니다.
char arrname[5];
size_t count = std::extent< decltype( arrname ) >::value;
그리고.extent에서 확인할 수 있습니다.type_traits표제의
또는 조금 더 멋있게 보이고 싶다면, 다음과 같이 포장합니다.
template < typename T, size_t N >
size_t countof( T ( & arr )[ N ] )
{
return std::extent< T[ N ] >::value;
}
그러면 다음과 같이 됩니다.
char arrname[5];
size_t count = countof( arrname );
char arrtwo[5][6];
size_t count_fst_dim = countof( arrtwo ); // 5
size_t count_snd_dim = countof( arrtwo[0] ); // 6
편집: "C++"가 아니라 "C" 플래그를 방금 알아차렸습니다.그러니 C 때문에 오신 분들은 이 게시물을 무시해 주시기 바랍니다.감사해요.
업데이트: C++ 17 지원(헤더에 정의됨)<iterator>)
대신 다음을 사용할 수 있습니다.
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);
GCC용은 모르겠지만 리눅스는 GCC의 내장형을 사용하여 그들의ARRAY_SIZE()매크로가 더 안전합니다(포인터에 적용되면 빌드 중단이 발생합니다).
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) \
BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
참고: 제 생각에는BUILD_BUG_ON_ZERO()매크로에 잘못된 이름이 있습니다(식이 0이 아닌 경우 빌드 실패가 발생하고 반환됨).0그렇지 않은 경우):
/* Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
이 매크로의 이름은 두 부분으로 나누어 본 결과라고 생각합니다.BUILD_BUG_ON식이 참일 때 매크로가 수행하는 작업입니다.ZERO는 매크로에 의해 '슬립'되는 값입니다(빌드 중단이 없는 경우).
이건?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
언급URL : https://stackoverflow.com/questions/4415530/equivalents-to-msvcs-countof-in-other-compilers
'programing' 카테고리의 다른 글
| MariaDB의 IN 문에 잘못된 결과가 있습니까? (0) | 2023.07.23 |
|---|---|
| 두 개의 서로 다른 쿼리를 하나의 결과로 오라클 SQL로 출력 (0) | 2023.07.23 |
| pip/easy_install 없이 pypi 모듈을 수동으로 설치하는 방법은 무엇입니까? (0) | 2023.07.23 |
| char[]는 스택에 있지만 char *는 힙에 있는 이유는 무엇입니까? (0) | 2023.07.23 |
| 키보드 잡기프로그램 종료 중 Python에서 인터럽트 발생 (0) | 2023.07.23 |