Last active
December 17, 2015 01:39
-
-
Save chaelim/5530087 to your computer and use it in GitHub Desktop.
C++ ArraySize Macros
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
VC stdlib.h macro | |
/* _countof helper */ | |
#if !defined(_countof) | |
#if !defined(__cplusplus) | |
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) | |
#else | |
extern "C++" | |
{ | |
template <typename _CountofType, size_t _SizeOfArray> | |
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; | |
#define _countof(_Array) (sizeof(*__countof_helper(_Array)) + 0) | |
} | |
#endif | |
#endif | |
============================ | |
Pasted from <http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx> | |
template <typename T, size_t N> | |
char ( &_ArraySizeHelper( T (&array)[N] ))[N]; | |
#define countof( array ) (sizeof( _ArraySizeHelper( array ) )) | |
===================== | |
http://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/stubs/common.h | |
// =================================================================== | |
// from google3/base/basictypes.h | |
// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr. | |
// The expression is a compile-time constant, and therefore can be | |
// used in defining new arrays, for example. | |
// | |
// GOOGLE_ARRAYSIZE catches a few type errors. If you see a compiler error | |
// | |
// "warning: division by zero in ..." | |
// | |
// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer. | |
// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays. | |
// | |
// The following comments are on the implementation details, and can | |
// be ignored by the users. | |
// | |
// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in | |
// the array) and sizeof(*(arr)) (the # of bytes in one array | |
// element). If the former is divisible by the latter, perhaps arr is | |
// indeed an array, in which case the division result is the # of | |
// elements in the array. Otherwise, arr cannot possibly be an array, | |
// and we generate a compiler error to prevent the code from | |
// compiling. | |
// | |
// Since the size of bool is implementation-defined, we need to cast | |
// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final | |
// result has type size_t. | |
// | |
// This macro is not perfect as it wrongfully accepts certain | |
// pointers, namely where the pointer size is divisible by the pointee | |
// size. Since all our code has to go through a 32-bit compiler, | |
// where a pointer is 4 bytes, this means all pointers to a type whose | |
// size is 3 or greater than 4 will be (righteously) rejected. | |
// | |
// Kudos to Jorg Brown for this simple and elegant implementation. | |
#undef GOOGLE_ARRAYSIZE | |
#define GOOGLE_ARRAYSIZE(a) \ | |
((sizeof(a) / sizeof(*(a))) / \ | |
static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment