Pasar literal de matriz como argumento macro

Resuelto Lie Ryan asked hace 13 años • 1 respuestas

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 ARRAYel 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.

Lie Ryan avatar Mar 31 '11 23:03 Lie Ryan
Aceptado

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 .

Jens Gustedt avatar Mar 31 '2011 18:03 Jens Gustedt