Jessedc
Con la introducción de arm64
como una arquitectura estándar para el iphoneos
En algunos casos, es necesario implementar condiciones de tiempo de compilación para el código específico de la arquitectura 64/32.
Si miras CoreGraphics/CGBase.h
y cómo algunos proyectos populares de código abierto son proporcionando soporte para arm64 está claro que puede verificar la presencia del tiempo de ejecución de 64 bits de esta manera:
#if defined(__LP64__) && __LP64__
...
#else
...
#endif
También es posible verificar específicamente para arm64
(a diferencia de solo un tiempo de ejecución de 64 bits) como se menciona en esta corrección para erikdoe/ocmock
#ifdef __arm64__
...
#else
....
#endif
¿Existe una lista completa o documentación para este tipo de definiciones? donde o cómo estan definidos?
CodaFi
Esas macros no son específicas de Cocoa, son específicas de CLANG y se pueden enumerar en la línea de comando con:
clang -dM -E -x c /dev/null
Las diferentes versiones de CLANG se envían con cantidades variables de indicadores de características que se pueden activar y desactivar en el momento de la configuración o según la plataforma y el sistema operativo en el que se esté ejecutando el compilador. Se puede encontrar una lista bastante completa en su encabezados de prueba con variantes para cada sistema compatible también dispersos en el directorio de prueba. La documentación para cada uno depende de si el indicador es específico de CLANG o está definido en una de las bibliotecas estándar con las que se vincula (por ejemplo __llvm__
es definido por CLANGpero __WCHAR_WIDTH__
está definido por LibC). Realmente no existe una lista completa con documentación definitiva por este motivo. Las diferentes plataformas pueden hacer las cosas de forma ligeramente diferente siempre que se adhieran a las especificaciones del idioma.
La mayoría de las macros de Objective-C públicas interesantes existen en Foundation cerca de la parte inferior de Foundation/NSObjCRuntime.h
.
-
Tenga en cuenta que muchas de las macros predefinidas del compilador son detalles de implementación que pueden cambiar en cualquier momento.
–Greg Parker
9 dic 2013 a las 23:46
-
@GregParker: Probablemente no cambiarán en en cualquier momentopero ciertamente podrían cambiar entre las versiones del compilador =)
– Esteban Canon
12 de diciembre de 2013 a las 3:19
-
Para otros visitantes en el futuro, la llamada CLANG anterior solo está descargando las propiedades activas para la configuración predeterminada actual del compilador. Si su compilación cruzada para iOS es un conjunto diferente. Puede tener una idea de cómo usar xcodebuild para ejecutar CLANG para un esquema específico aquí, e intentará actualizar más detalles sobre eso o relacionados. stackoverflow.com/questions/20116475/…
–Barney Mattox
26 de julio de 2014 a las 8:36
-
clang -dM -arch arm64 -E -x c /dev/null
imprimirá las definiciones para ARM64– tidwall
08/07/2015 a las 21:38
Después de algunos años, llegué aquí mientras buscaba y ofrecí esta actualización:
Tenga en cuenta que __LP64__
no es una verificación confiable para el tiempo de ejecución de 64 bits en ningún sistema que no defina __LP64__
. Esto se debe a que LP64 es el nombre del modelo de datos en uso, que es uno de varios modelos de datos de 64 bits que se pueden seleccionar.
Modelo de datos es el término utilizado para describir la disposición de los tipos estándar de C/C++ por tamaño. En este ejemplo, LP64 significa que long
y pointer
son de 64 bits, con la implicación de que todo lo demás es más pequeño. Esta es una configuración GCC/Clang bastante estándar, pero de ninguna manera universal (otras plataformas de 64 bits usan otros estándares). Microsoft, creo, usa LLP64 como su modelo de datos, con long long
y pointer
siendo de 64 bits, mientras que int
y long
ambos están asignados 32.
Incluso hay un SILP64 modelo de datos – cortos de 64 bits, ¡ay!
Si desea detectar 64 bits, será mejor que consulte la página de macros predefinidas, que ya se ha mencionado. Puedes detectar la arquitectura e ir desde allí. Si desea conocer el tamaño de ciertos tipos, probablemente podrá determinar esa información de manera más portátil al (1) verificar el resultado de sizeof(...)
; o (2) comprobando los valores para, por ejemplo, INT_MAX
, LONG_MAX
etc.
-
Agradezco la respuesta después de tantos años.
– Jessedc
4 de enero de 2022 a las 3:12
Puedes encontrar esta lista útil.
El enlace apunta exactamente a la lista de arquitectura ifdef, aquí puede encontrar enlaces a otras listas (para compilador y detección de plataforma).