Recién comencé a aprender C y me preguntaba si hay una diferencia entre una matriz declarada como esta: int m[10][5]; y una matriz declarada así:

#define NL 10
#define NC 5
int m[NL][NC];

Pensé que la memoria asignada podría ser diferente, pero no estoy realmente seguro.

1
Andre 28 dic. 2019 a las 18:57

2 respuestas

La mejor respuesta

Las #define son "directivas de preprocesador". El preprocesador C (CPP) es básicamente un programa que ejecuta su compilador antes de procesar realmente su código C.

Para sus #define 's, el preprocesador básicamente hace una "búsqueda y reemplazo" de NL y NC, reemplazando con 10 y 5, respectivamente. Lo hace sin mucha comprensión de C. (De hecho, podría ejecutar el preprocesador de C en cualquier tipo de archivo de texto y hacer que haga la misma búsqueda y reemplazo).

Para que gcc o clang se detengan después de ejecutar el preprocesador, use la opción -E y escribirá los resultados del preprocesador en stdout.

Aquí hay un ejemplo de que GCC se detiene después de ejecutar el preprocesador en su código fuente:

$ gcc -E andre.c
# 1 "andre.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "andre.c"


int m[10][5];

Como puede ver, después de ejecutar el preprocesador, NL y NC han sido reemplazados por el texto que proporcionó en sus #define.

Si está utilizando un compilador que no sea gcc o clang, consulte su documentación sobre cómo detener el procesamiento después de ejecutar el preprocesador. A menudo, el código fuente preprocesado tiene la extensión .i.

(En mi máquina, cpp andre.c hace exactamente lo mismo que la llamada a gcc anterior).

1
zanedp 28 dic. 2019 a las 17:10

Las macros C / C ++ serán reemplazadas por el compilador con código en línea y no hay diferencia entre la declaración con #define y el código en línea.

1
Mohamed Hassan 28 dic. 2019 a las 16:26