Si llamas a algo como esto en C:
#include <stdio.h> #define REPS ,a ... int a = 1; printf("%d" REPS); Funcionará, pero ¿es posible llamar a la macro REPS varias veces en función de un valor desconocido, como por ejemplo, que quiero tener cinco entradas en un scanf , pero quiero que mi código lo automatice (por ejemplo, si #define REPS ,a[i] entonces: ... ,a[1] ,a[2] )?
Funcionará, pero ¿es posible llamar a REPS varias veces en función de un valor desconocido?
No. #define crea una macro de preprocesador que puede usar en su código, pero cuando el compilador compila su código, el valor real se sustituye por la macro. Si usted tiene:
#define FOO 7 por ejemplo, cada aparición de FOO en su código se reemplaza por 7 antes de compilar el código; para cuando el compilador ve tu código, no hay #define ni FOO , solo 7 donde sea que haya FOO . Aunque existen otros comandos de preprocesador (p. ej. #if ) que pueden controlar si se evalúa un determinado #define , no existen otras estructuras de control de preprocesador (bucles, etc.).
Quiero tener cinco entradas en un scanf, pero quiero que mi código lo automatice (por ejemplo, si #define REPS ,a[i] entonces: ... ,a[1] ,a[2])?
Ciertamente puedes automatizar algo así; es solo que el preprocesador no es la herramienta adecuada para el trabajo. Considerar:
int reps = 5 //... for (int i = 0; i < reps; i++) { scanf(" %d", &a[i]); }REPS se evalúa en tiempo de compilación, por lo que no puede depender de los valores de tiempo de ejecución en este caso, a archivo . Hay trucos, pero en general no se pueden compilar bucles con macros.
Le sugiero que escriba una función a lo largo de estas líneas en su lugar:
#include <stdio.h> void print_int_array(size_t n, int a[n]) { for(int i = 0; i < n; i++) printf("%d%s", a[i], i + 1 < n ? ", " : "\n"); } int main() { print_int_array(0, (int []) {}); print_int_array(1, (int []) {1}); print_int_array(2, (int []) {1, 2}); }