cuanto se puede ganar en bet365
¿Cuál es el significado de esta macro C? (1)
Las macros PREFIX y POSTFIX están destinadas a dar 0 cuando no se dan argumentos, es decir, MPL_ARGS_SIZE()
. En este caso, Y_TUPLE_SIZE_PREFIX_
y _Y_TUPLE_SIZE_POSTFIX
se concatenan para producir Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX
, lo que fuerza el resultado a 0.
En el caso general, __VA_ARGS__
no está vacío, por lo que la concatenación simplemente se expande al mismo número de argumentos que se dieron. Esto es seguido por 32, ... 0.
En ambos casos, los argumentos se envuelven entre paréntesis. Y_TUPLE_SIZE_II
quita estos paréntesis adicionales y pasa los argumentos a Y_TUPLE_SIZE_I
. Y_TUPLE_SIZE_I
solo se expande a su argumento número 33, descartando el resto.
Entonces, si le das 32 argumentos, esos 32 serán salteados y el número que los sigue, 32, será el resultado, como desees. Si le da 31 argumentos, omitirá esos 31, y el primer número que sigue, es decir, 32, y el resultado será el siguiente número, 31, nuevamente según lo deseado.
Si le da un solo argumento, omitirá ese argumento y los 31 que lo siguen, y el resultado será 1.
Si no le da argumentos, entrará en juego el caso especial de Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX
, que es 32 argumentos vacíos seguidos por 0. Se omitirán los 32 argumentos vacíos, y el resultado será 0.
El motivo del caso especial para ningún argumento es que sin él, se comportaría igual que el caso de un argumento. Lo siguiente puede ayudar a entenderlo mejor:
#define Y_TUPLE_SIZE_II(__args) Y_TUPLE_SIZE_I __args
#define Y_TUPLE_SIZE_I(__p0,__p1,__p2,__p3,__p4,__p5,__p6,__p7,__p8,__p9,__p10,__p11,__p12,__p13,__p14,__p15,__p16,__p17,__p18,__p19,__p20,__p21,__p22,__p23,__p24,__p25,__p26,__p27,__p28,__p29,__p30,__p31,__n,...) __n
#define MPL_ARGS_SIZE(...) Y_TUPLE_SIZE_II((__VA_ARGS__,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
Este es el conjunto original de macros, pero con todo el manejo de casos especiales para cero argumentos eliminados. Funciona para todo menos para el caso de argumento cero, que devuelve 1 en lugar de 0.
Para manejar argumentos cero, empareja la lista de argumentación entre las macros de prefijo y postfijo. Si el resultado se expande a Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX
, la lista de argumentos estaba vacía y el caso especial entra en juego.
Aquí hay una macro puede calcular el conteo de argumentos. y el código como:
#define Y_TUPLE_SIZE_II(__args) Y_TUPLE_SIZE_I __args
#define Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
#define Y_TUPLE_SIZE_I(__p0,__p1,__p2,__p3,__p4,__p5,__p6,__p7,__p8,__p9,__p10,__p11,__p12,__p13,__p14,__p15,__p16,__p17,__p18,__p19,__p20,__p21,__p22,__p23,__p24,__p25,__p26,__p27,__p28,__p29,__p30,__p31,__n,...) __n
#define MPL_ARGS_SIZE(...) Y_TUPLE_SIZE_II((Y_TUPLE_SIZE_PREFIX_ ## __VA_ARGS__ ## _Y_TUPLE_SIZE_POSTFIX,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
// the running result ---------------------------------------
MPL_ARGS_SIZE(a,b,c,d,e,f,g)==7
MPL_ARGS_SIZE(a,b,c,d)==4
como entender
#define Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
y
Y_TUPLE_SIZE_PREFIX_ ## __VA_ARGS__ ## _Y_TUPLE_SIZE_POSTFIX
?
Por cierto, sé sobre el uso de ## (libras, libras) y el mecanismo de #define Y_TUPLE_SIZE_I