¿Hay algún equivalente incorporado a _countof
proporcionado por otros compiladores, en particular GCC y Clang? ¿Hay algún formulario que no sea macro?¿Equivalentes a la cuenta de MSVC en otros compiladores?
Respuesta
Esto?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
No estoy al tanto de uno por GCC, sino que Linux utiliza GCC's __builtin_types_compatible_p
builtin para hacer su ARRAY_SIZE()
macro más seguro (que va a causar una ruptura de compilación si se aplica a un puntero):
/* &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))
Nota: creo que el BUILD_BUG_ON_ZERO()
macro tiene un nombre engañoso (que causa una falla de generación si la expresión es no cero y vuelve 0
lo contrario):
/* 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); }))
creo que la nomenclatura para esta macro viene de mirarlo en dos partes: BUILD_BUG_ON
es lo que hace la macro cuando la expresión es verdadera, y ZERO
es el valor 'devuelto' por la macro (si no hay una acumulación descanso).
Usando 11 C++, la forma no macro es:
char arrname[5];
size_t count = std::extent< decltype(arrname) >::value;
Y extent
se pueden encontrar en la cabecera type_traits
.
O si usted quiere que se vea un poco más agradable, lo envuelve en esto:
template < typename T, size_t N >
size_t countof(T (& arr)[ N ])
{
return std::extent< T[ N ] >::value;
}
Y entonces se convierte en:
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
Editar: me he dado cuenta de la "C" bandera en lugar de "C++". Entonces, si estás aquí por C, por favor amablemente ignora esta publicación. Gracias.
Una diferencia: al menos en MSVC, std :: extent
También lo probó en GCC y eso también devuelve 0. – Ash
Tiene que hacer su recuento de constexpr de función, de lo contrario no funcionará. Además, es más simple "devolver N"; en lugar de "std :: extent < T[ N ] > :: value;". – prgDevelop
Se puede utilizar en lugar boost::size():
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);
Boost es C++, mientras que las preguntas se etiquetan como C. – tambre
La respuesta más votada también es C++, al igual que la implementación '_countof' en MSVC – KindDragon
No lo consideraría que una justificación de publicar una respuesta para otro idioma en una pregunta no etiquetada con ese idioma. – tambre
- 1. git stash Equivalentes en otros sistemas de control de revisiones?
- 2. Hacer GCC y otros compiladores de C++ Muy estricto
- 3. MSVC equivalente a __builtin_popcount?
- 4. AS3 a compiladores JS
- 5. C# equivalentes a la unión C
- 6. Equivalente a open_memstream para MSVC
- 7. Convertir a Win32 GetLastError() equivalentes
- 8. Equivalentes a SQL Server TOP
- 9. Rieles equivalentes a php die()?
- 10. comportamiento diferente de los compiladores con la asignación de gama
- 11. ¿La biblioteca de tarea paralela (o PLINQ) tiene en cuenta otros procesos?
- 12. C# equivalentes a Arrays.fill de Java() método
- 13. rieles equivalentes a "opciones" de Django
- 14. Formas de pago equivalentes a javascript setTimeout
- 15. Vinculación a la DLL de MSVC desde MinGW
- 16. Infinity en MSVC++
- 17. Conectando a los compiladores de Java
- 18. atributos de función pure/const en compiladores diferentes
- 19. Haskell a los compiladores de Javascript?
- 20. Análisis semántico en compiladores
- 21. Coincidencia de tipos de va_list entre compiladores
- 22. Portabilidad de pthreads-win32 sobre varios compiladores de ventanas
- 23. NullPointerException en la cuenta sincronizada
- 24. Compiladores para Haskell
- 25. enviar correo a la cuenta de Gmail
- 26. . Herramientas y librerías equivalentes a .NET
- 27. usando msvc lib en mingw
- 28. JavaScript "compiladores"
- 29. Dependencias de MSVC vs. Referencias
- 30. ¿Es seguro desactivar la advertencia MSVC C4482?
que sería peligroso cuando a es un puntero (frente a matriz). el macro _countof es seguro. – Uri