Pasar literal de matriz como argumento macro
Esto me ha estado molestando durante algún tiempo, por ejemplo, si intento escribir este código:
// find the length of an array
#define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(int))
// declare an array together with a variable containing the array's length
#define ARRAY(name, arr) int name[] = arr; size_t name##_length = ARRAY_LENGTH(name);
int main() {
ARRAY(myarr, {1, 2, 3});
}
El código da este error:
<stdin>:8:31: error: macro "ARRAY" passed 4 arguments, but takes just 2
Porque considera ARRAY(myarr, {1, 2, 3});
que se pasa ARRAY
el argumento myarr
, {1
, 2
, y 3}
. ¿ Hay alguna forma de pasar un literal de matriz a macros?
EDITAR: En algunas de las macros más complejas que necesitaba, es posible que también necesite pasar dos o más matrices a la macro, por lo que la macro variada no funciona.
Sí, {}
no hay paréntesis para el preprocesador. Simplemente puede proteger los argumentos mediante una macro ficticia.
#define P99_PROTECT(...) __VA_ARGS__
ARRAY(myarr, P99_PROTECT({1, 2, 3}));
Debería funcionar en tu caso. Con eso tienes un primer nivel ()
que protege ,
de ser interpretado como separador de argumentos. Estos ()
de la llamada macro desaparecen en la expansión.
Consulte aquí para ver macros más sofisticadas que desenrollan declaraciones .