[Lenguaje C] Entorno del programa y preprocesamiento (¿qué pasó con el código que escribiste?)

contenido

1. El entorno de traducción y entorno de ejecución del programa

En segundo lugar, compile && enlace

1. Preprocesamiento

2. Compilar (compilar en sentido estricto)

3. Montaje

4. Enlaces

Aviso:

3. Preprocesamiento

símbolos predefinidos

#definir

1. #define definir identificador

2. Defina un alias para el tipo

3. Personaliza algunas palabras clave

4. Haz algunos cambios de compilación a través de macros

5. Defina un fragmento de código

Ya existen funciones, ¿por qué tener macros para lograr un efecto similar?

Problemas con las macros


1. El entorno de traducción y entorno de ejecución del programa

  1. Entorno de traducción: el entorno en el que el código fuente se traduce en instrucciones de máquina ejecutables.
  2. Entorno de ejecución: utilizado para ejecutar realmente el código.

En segundo lugar, compile && enlace

Cuando presionamos CTRL+F5 cuando terminamos de escribir el código, el código dice:

  1. Compilar: convertir archivos .c en archivos exe
  2. Ejecutar: ejecute el archivo exe y apunte a la lógica interna

Pero aquí estamos hablando de la compilación "generalizada" al compilar.De hecho, esta compilación se puede dividir en muchos pasos.

1. Preprocesamiento

El compilador primero realiza un procesamiento preliminar del código: ejecutará las instrucciones de preprocesamiento en el código (comenzando con #)

Cuando el contenido de entrada es un archivo .c, el contenido de salida sigue siendo un archivo .c

2. Compilar (compilar en sentido estricto)

Convierta un archivo de lenguaje C en un archivo de lenguaje ensamblador

La razón es : el lenguaje C es un lenguaje de alto nivel y la computadora no puede reconocerlo directamente. Esto requiere un compilador para convertir el lenguaje de alto nivel en instrucciones de máquina. El lenguaje ensamblador y las instrucciones de máquina pueden considerarse como un "uno a -una relación de "correspondencia".

3. Montaje

Este proceso es para convertir archivos de lenguaje ensamblador en instrucciones binarias de máquina.

4. Enlaces

Cada archivo .c incluirá el archivo de instrucciones de la máquina correspondiente, y el proceso de vinculación consiste en combinar los resultados generados por varios archivos .c. (Debido a que a menudo implica que el contenido de un archivo sea llamado por otro archivo, la simple compilación de un archivo no conoce la definición de esta función. Para obtener el contenido real de las instrucciones de ejecución de esta función, es necesario Los dos archivos son finalmente fusionado)

Aviso:

Estamos aquí para distinguir entre "enlaces" y "conexiones"

Conexión: conexión (en programación de red)

Enlace: Enlace (Asociando dos cosas guan'xi)

Entorno operativo:

El proceso de ejecución del programa:

  1. El programa debe cargarse en la memoria. En un entorno con sistema operativo: Normalmente esto lo hace el sistema operativo. En un entorno independiente, la carga de programas debe organizarse manualmente, posiblemente colocando el código ejecutable en la memoria de solo lectura.
  2. Comienza la ejecución del programa. Luego llama a la función principal
  3. Comience a ejecutar el código del programa. En este punto, el programa utilizará una pila de tiempo de ejecución (stack) para almacenar las variables locales de la función y las direcciones de retorno. Los programas también pueden utilizar la memoria estática.Las variables almacenadas en la memoria estática conservan sus valores durante la ejecución del programa.
  4. Terminar el programa. Termina la función principal normalmente; también puede terminar inesperadamente.

3. Preprocesamiento

símbolos predefinidos

Algunos símbolos de preprocesamiento del lenguaje C pueden hacernos más convenientes (los siguientes están integrados en el lenguaje C)

__FILE__ //El archivo fuente que se compilará
__LINE__ //El número de línea actual del
archivo __DATE__ //La fecha
en que se compiló el archivo __TIME__ //La hora en que se compiló el archivo
__STDC__ //Si el compilador sigue ANSI C, su valor es 1, de lo contrario indefinido

demostración de código:

#include <stdio.h>
int main() {
	printf("%s\n", __FILE__);
	printf("%d\n", __LINE__);
	printf("%s\n", __DATE__);
	printf("%s\n", __TIME__);
	return 0;
}

resultado de la operación:

Se puede ver que a través de los símbolos predefinidos, podemos imprimir fácilmente el nombre del archivo fuente compilado, el número de línea donde se encuentra el código, la fecha de compilación del código y la hora de compilación.

La macro __STDC__ se puede usar para determinar si el compilador actual cumple con el estándar C. Si lo hace, el resultado es 1. Si no lo hace, el resultado puede ser 0 o indefinido. (Pero esta macro ya no se usa comúnmente ahora)

#definir

1. #define definir identificador

El siguiente código:

int arr[10] = { 0 };

 Aquí se crea una matriz arr con una longitud de 10. Este 10 es en realidad un número mágico . Después de escribir más código más tarde, podemos usar este 10 en los siguientes bucles, pero podemos usar este 10 más adelante. No sé qué significa específicamente el 10, y si queremos cambiar el número 10 más tarde, tenemos que cambiar muchos lugares (propenso a errores), pero será muy conveniente usar #define para definir constantes de identificador

#define SIZE 10 
int main() {
	int arr[SIZE] = { 0 };
	return 0;
}

De esta forma te resultará muy intuitivo y cómodo, cuando veas TAMAÑO más adelante sabrás cuál es y te será muy cómodo cambiarlo. 

2. Defina un alias para el tipo

Será más problemático escribir con int sin firmar cada vez, redefina un nombre para él a través de #define 

#define uint unsigned int
int main() {
	uint num = 5;
	return 0;
}

3. Personaliza algunas palabras clave

Haz lo siguiente

#define and &&
int main() {
	int a = 0;
	int b = 0;
	if (a > 0 and b > 0) {
		printf("hello");
	}
}

Al hacer esto, podemos reemplazar && con y 

4. Haz algunos cambios de compilación a través de macros

A veces, algún código que escribimos solo espera que sea compilado en algunos casos específicos, y no involucrado en la compilación en otros casos, esto es compilación condicional

Utilice los siguientes comandos

#si

#demás

#ifdef

#ifndef

#terminara si

…………

 El siguiente código:

#define TEST 1

#if TEST
int main() {
	
	return 0;
}
#endif

En este código, agregamos un comando de compilación condicional antes y después del código. Si la condición después de #if es verdadera, entonces ejecute la compilación del código intermedio, de lo contrario no se compilará. Al principio, usamos #define para hacer un cambio de macro, para que podamos lograr el efecto deseado

Aplicación típica 1: un código es compatible tanto con el entorno de desarrollo como con el entorno de lanzamiento

Aplicación típica 1: un código es compatible con diferentes sistemas

Aplicación típica 1: evitar que los archivos de encabezado se incluyan repetidamente

 Aplicación típica 1: darse cuenta del efecto de los comentarios de varias líneas

5. Defina un fragmento de código

El siguiente código puede lograr un efecto similar a llamar a una función a través de una macro

#define ADD(x, y) x + y
int main() {
	int a = 5;
	int b = 10;
	printf("%d\n", ADD(a, b));
	return 0;
}

resultado de la operación:

 Nota: Esto es muy diferente de la definición de función

  1. comienza con #define
  2. () el parámetro no tiene tipo
  3. Tampoco hay declaración de retorno en la parte de la expresión.
  4. sin tipo de valor de retorno

Ya existen funciones, ¿por qué tener macros para lograr un efecto similar?

  1. Los parámetros pueden ser de cualquier tipo y una macro se puede usar para múltiples situaciones
  2. Evite la sobrecarga de las llamadas a funciones, especialmente la sobrecarga de copiar parámetros. Esta operación es más eficiente que las llamadas a funciones.

Pero todavía no se recomienda usar macros.

Problemas con las macros

  1. Después de la expansión macro, es probable que ocurran algunos efectos inesperados (los parámetros macro tienen efectos secundarios, problemas de paréntesis)
  2. El código definido por la macro debe estar en la misma línea, lo cual es muy inconveniente para depurar y leer
  3. La macro no puede repetirse
  4. Macro sin comprobación de parámetros

-------------------------------------------------- ---------------

-------------Entorno de programa de lenguaje C y parte de preprocesamiento completada---------

¡Bienvenidos todos a prestar atención! ! !

¡Aprender a comunicarnos juntos! ! !

¡Vamos a programar hasta el final! ! !

-------------- No es fácil de organizar, apoye tres consecutivos -------------------

Supongo que te gusta

Origin blog.csdn.net/weixin_46531416/article/details/121175241
Recomendado
Clasificación