Discusión sobre cómo convertir programas C++ en programas C
Discusión sobre cómo convertir un programa C++ en un programa C
[Resumen] C++ se desarrolla sobre la base del lenguaje C. Este no es el caso, porque el intérprete de C++ ocupa más espacio de almacenamiento que el intérprete de lenguaje C. Para ahorrar espacio de almacenamiento limitado y reducir el costo de los sistemas integrados, es necesario convertir los programas fuente escritos en C++ en programas fuente C.
[Palabras clave] Programa C++ Discusión sobre la conversión del programa C
I Descripción general de los programas C++ y C
C++ se desarrolla sobre la base de C. C++ El más grande. La diferencia con C es el concepto y las características de las clases en C++. El problema de cambiar de C++ a C se transforma en el problema de cómo eliminar clases. Hay dos métodos: el primero es eliminar las características orientadas a objetos de C++, primero comprender toda la lógica del código fuente y luego reescribirlo; el segundo es conservar algunas de las características orientadas a objetos de C++ y usar estructuras; para implementar funciones de clase. El primer método está bien para una pequeña cantidad de clases. Si hay una gran cantidad de clases, llevará mucho tiempo comprender todo el código fuente y luego reescribirlo, y es fácil cometer errores. Si te encuentras con un proyecto a gran escala, es casi imposible entender todo el código fuente. En este momento, debe utilizar el segundo método. Puede cambiar clase por clase sin ninguna dificultad. Si no hay errores, casi no habrá errores. Quizás no sea necesario comprender la lógica del programa. Estará familiarizado con el programa después de cambiarlo. Aún se desconocen las funciones a implementar. Esto no quiere decir que los ignorantes no tengan miedo, simplemente significa que este método no tiene nada que ver con la lógica del programa en sí. Así que aquí está el segundo enfoque, que consiste en echar un vistazo inicial a algunas de las características de C++ y cómo implementarlas o reemplazarlas en C.
En segundo lugar, convierta el programa C++ en un programa C
Para facilitar la siguiente discusión, primero hagamos algunas explicaciones:
1. Función Ixx es una implementación de clase del constructor de xx.
2. El prefijo de la función miembro de la clase original es el nombre de la estructura +?
3. El puntero de función U es la declaración del destructor de la clase original
4. El nombre de la estructura U+ es la implementación del destructor de la clase original
p>5.Fun_+nombre de estructura es un puntero a la función miembro de la estructura.
El contenido anterior no se repetirá en el futuro.
(1) Funciones miembro y datos de los miembros de la clase
Dado que la estructura no controla los derechos de acceso de los miembros, se deben agregar mecanismos de control de acceso adicionales para complicar el programa, por lo que Sólo renunciar al control de acceso.
1. En lenguaje C, los miembros de datos de una clase se pueden convertir directamente en los miembros de datos de una estructura.
2.
2. La función debe convertirse en un puntero de función, porque la estructura no permite la declaración y definición de funciones. Además, si hay modificadores como virture e inline antes de la función, también deben eliminarse, como function void funca (int a); cámbielo a void (*funca) (struct B *p, int a); Se puede ver que se agrega el prototipo del puntero de función. Se obtiene un puntero a la estructura B. Esto se debe a que las operaciones de los miembros de la clase deben realizarse dentro de la función. Esto se debe a que para operar los miembros de la clase dentro de la función, debe confiar en ese puntero. especificar los miembros de la estructura. En una función miembro de clase, un puntero a sí mismo está implícito en la lista de parámetros.
3. Para los miembros estáticos, se definen como variables globales o funciones globales, porque no puede haber miembros estáticos en una estructura.
(2) Constructor de la clase
La clase llamará al constructor predeterminado cuando se cree una instancia y definirá un puntero de función con el mismo nombre en la estructura, apuntando a una función de inicialización. Constructor y agregue una declaración de puntero de función de inicialización que sea diferente de la función de inicialización en el constructor. Al crear variables de estructura, use malloc en lugar de new y llame a la función de inicialización manualmente.
(C) Destructor de clase
El destructor de clase es responsable de liberar los recursos ocupados.
En lenguaje C, ambas estructuras utilizan el puntero de función U en lugar del destructor. La razón por la que todas las estructuras usan el puntero U es la siguiente:
Si el puntero de subclase se asigna al puntero de clase base, el puntero de clase base no necesita considerar qué nombre de función se llama al destructor cuando se lanza. , puede llamar directamente a la función miembro U.
La clase .Destructor es llamada por el sistema. El sistema llama al .Destructor de una clase, pero en C se llama explícitamente. Cuándo llamarlo es una cuestión de juicio preciso.
(iv) Constructor de copia de clase
El objetivo principal del constructor de copia de clase es acelerar la construcción de la clase en las siguientes situaciones:
1 . Como los parámetros se pasan a la función. (additem(Itema))
2. Como valor de retorno de una función.
3. Como parámetro al crear una instancia de una clase.
En los tres casos, el sistema llama directamente al constructor de copia de la clase en lugar del constructor.
Nota: C=D; no llamará al constructor de copia, en cuyo caso se utilizará el operador sobrecargado ? (Ver sobrecarga de operadores para más detalles);
Dado que la definición de variables de estructura y el uso de todos los punteros en C no utilizan el constructor de copia, no se considera por el momento. Para las variables de clase que originalmente requieren parámetros de función o valores de retorno, todas deben convertirse en punteros de clase. El caso de crear instancias de una clase como parámetro se puede resolver definiendo un constructor separado con parámetros.
(5) Funciones virtuales y en línea de clases
Para funciones virtuales y en línea, se deben eliminar los modificadores de funciones virtuales y en línea. Se debe eliminar el cuerpo de la función en línea y definir la función en línea como una función externa. Por ejemplo:
Clase B
{
?
virtud void funb()
inline int; agregar ()const
{return a+b;};
privado:
int a
int p >
}
Cambiar a:
typedef claseB B
estructura claseB
{
?
void (*funb)(struct claseB *p
int (*add)(struct claseB
int a;
int b;
}
void classB_funb(B *p)
{ p >
?
}
int claseB_add(B *p)
{
return p->a+p - >b;
}
void fun_classB(B *p)
{
p? - >funb=classB_funb;
p->add=classB_add;
}
(6) Sobrecarga
Hay dos tipos en la clase Tipos de sobrecarga, sobrecarga de funciones y sobrecarga de operadores:
1. La sobrecarga de funciones cumple las siguientes condiciones: el nombre de la función es el mismo, pero el número de parámetros o tipos de parámetros son diferentes. De esta manera, cuando lo llamas, llama a una función diferente según los argumentos que ingresas. En C hay que nombrarlos de otra manera, no hay otra manera.