2009-08-02 20 views
6

Me convertí en un programador profesional en la era del código orientado a objetos, y tengo años de experiencia en programación en C++. A menudo trabajo en proyectos grandes que tienen años de código heredado en una combinación de C++ y c. Me siento menos cómodo trabajando en partes puras de sistemas. Desde la programación en C++ entiendo toda la sintaxis c, pero hay un vacío en mi conocimiento sobre cómo organizar un programa c complejo sin objetos, y lo que constituye la mejor práctica para administrar la memoria que me gustaría llenar. Aprendí C++ después de trabajar como programador de Java, y creo que un poco más c me haría un mejor programador de C++, y un poco menos de Java traducido a programador de C++¿hay algún tutorial para ayudar a un programador experto en C++ a aprender c?

+0

alguna vez el tutorial que he encontrado parece suponer que usted es un programador de c que se traslada a C++. Seguramente no puedo ser el único programador orientado a objetos que quiera entender mejor c. –

+0

Creo que si escribes un par de programas de C de tamaño mediano que te enseñarán a mantenerte alejado de problemas. En realidad, meterse en problemas (en cualquier idioma) es una forma valiosa de aprender. Como tocar algo caliente. – Nosredna

+0

Hay varias preguntas en este sentido en StackOverflow ya (y algunos C# pasando a c preguntas). Desde mi hablante c nativo, más funcional en C + +, creo que vi varias cosas que parecían buenas. Podrían valer la pena cazar. – dmckee

Respuesta

1

En términos de organización, mirando el POSIX APIs, especialmente pthreads le dará una buena idea de cómo organizar el código C. Las reglas básicas de la buena organización del proyecto C son:

  • No exponga sus estructuras. Use solo tipos opacos.
  • Utilice la biblioteca y los nombres de tipos de datos como prefijos para los nombres de las funciones.
  • Proporcionan funciones de "crear" y "destruir" para asignación/construcción y destrucción/desasignación.
  • Pase el tipo opaco como el primer parámetro para las funciones que operan en ese tipo.
  • Implemente las C API utilizando C o C++ (depende de usted). Obviamente, usa tipos no opacos allí.
0

Buscando en la construcción de programas con un uso extensivo de punteros también como estructura de bajo nivel sería un buen comienzo en mi opinión de todos modos. También depende de para qué está diseñado el programa. ¿Estás tratando de escribir el código C en una placa rtos incorporada o en un sistema de microcontrolador?

+0

a veces trabajo en sistemas heredados que tienen mucha c, por lo que esa es la razón inicial. También sospecho que me haría un mejor programador de C++ para estar más familiarizado con el diseño de programas que se basan en datos en estructuras y otras técnicas de c, en lugar de asumir que todo tiene que ser un objeto. –

+0

En ese caso, le sugiero que mejore el conocimiento de su puntero, ya que Java no le permite tratar con punteros. Además, si desea aprender sobre la optimización de hardware, sería genial si puede obtener una computadora de placa única, microcontroladores o teléfono inteligente/PDA integrados para aprender a escribir C/C++ optimizado para hardware. – stanigator

1

Estaba básicamente en el mismo barco que tú (aunque con menos experiencia, y comencé con Python en lugar de Java), y lo que funcionó mejor para mí fue sentarme y leer Kernighan y Ritchie. Podrá leer la primera mitad del libro porque se siente cómodo con la sintaxis, pero definitivamente se irá con una mejor comprensión de la gestión de la memoria de bajo nivel.

Leer las partes de la fuente del kernel de Linux que tienen que ver con la administración de la memoria también ayuda, pero no es para los débiles o aburridos.

1

Ampliando another answer, una forma es simplemente escribir C. Esta es la forma más bibliotecas que interactúan con comportan (por ejemplo la pila GNOME es casi totalmente orientada a objetos C, en su mayoría sobre la base de la gobject orientado a objetos biblioteca para hacerlo más fácil). Puedes pensar que es C++ sin algo del azúcar sintáctico.

Se termina con una API como


/* in project NewStuff; namespace is ns */ 
ns_foo_t *ns_foo_new(); 
void ns_foo_delete (ns_foo_t *); 

int ns_foo_make_waffles (ns_foo_t *this, int no_of_guests); 

int main() { 
    ns_foo_t *my_foo = ns_foo_new(); 
    ns_foo_make_waffles (my_foo, 1); 
    ns_foo_delete (my_foo); 
} 

que corresponde casi exactamente a


class Foo { 
    public: 
    Foo() { /* whatever */ } 

    int make_waffles (int no_of_guests) {} 
}; 

int main() { 
    Foo *my_foo = new Foo(); 
    my_foo->make_waffles (1); 
    delete my_foo; 
} 
+0

Falta un asterisco en la primera línea principal() del ejemplo c. – quinmars

+0

Bastante cierto. Gracias, lo he arreglado. – RAOF

Cuestiones relacionadas