9
votes

Comment structurer votre programme C?

Je travaille / codage dans C # / Java depuis quelques années, de sorte que les bases, etc. Ne me donnez pas beaucoup de difficultés. Mais je n'ai jamais rien fait plus grand que les petits programmes d'apprentissage de la ligne de commande en c.

Maintenant, j'essaie de créer un émulateur de téléphone portable pour Linux et je n'ai aucune idée de la structure de mon code lorsque son objet n'est pas orienté objet. J'ai 3 gros livres qui couvrent C en détail mais aucun d'entre eux ne couvre comment coder pour la maintenabilité dans un projet plus grand.

J'espérais donc que certaines d'entre vous, des personnes plus expérimentées pourraient me signaler à une meilleure pratique ou similaire?

c

3 commentaires

Je serais tenté d'utiliser C ++, mais vous pouvez toujours écrire du code OO en C - sans aucune construction de langue.


Le code doit être en C, mais sinon je serais sûrement d'accord;).


Pourquoi le code "doit-il" être en C? Est-ce que quelqu'un tiennent une arme à feu à votre tête disant "Si je vois un seul std :: COUT Je vais ..."


7 Réponses :


7
votes

Certaines pensées (et cette question devrait être un wiki communautaire)

  • Même si ce n'est pas une programmation orientée vers l'objet à part entière, essayez de vous cacher des pratiques de masquage d'informations. Laissez vos fonctions retournez des pointeurs ou des poignées sur des structures opaques (l'API de la poignée de fichier UNIX est un exemple bon (précoce). Utilisez des fonctions statiques dans lesquelles vous utiliseriez des méthodes privées.
  • Essayez de garder la fonctionnalité connexe contenue dans un seul fichier. Cela facilitera la tâche plus facile d'utiliser le mot-clé statique AVOVÉMÉTIVÉ, ainsi que de vous donner une bonne indication lorsqu'il est temps de diviser certaines fonctionnalités en un fichier séparé. Pour un programmeur Java, cela ne devrait pas être trop étrange une pratique.
  • Les pratiques standard sur les commentaires s'appliquent. Utilisez quelque chose comme DOXYGEN si vous recherchez quelque chose de similaire à Javadoc / C # XML Commentaires.
  • Si vous n'avez vraiment rien fait de sérieux dans C pendant un certain temps, viennent prendre des pratiques pour garder votre gestion de mémoire propre et sensible, même si ce n'est pas dur en soi, va Blessez beaucoup plus alors d'établir des pratiques pour la maintenabilité. Juste un avertissement.

3 commentaires

Vous devriez clarifier - par "UNIX Dossier de la poignée d'API" que vous voulez dire ouvert (2) et amis ou fopen (3) et amis?


Je voulais dire les appels ouverture (2) - fopen (3) fait réellement partie de la norme C. Aux fins de l'argument, il n'est pas pertinent, cependant, comme les deux utilisent des informations similaires cachées. Si une poignée de fichier est un pointeur ou un entier est un détail de mise en œuvre.


Addenda: Dans la plupart des cas, vous voudrez un pointeur pour éviter de garder l'état mondial.



2
votes

structure en général la même chose. Séparez les choses en plusieurs fichiers, chacun contenant du code qui effectue des travaux connexes.

Souvent avec C, vous pouvez toujours penser à des objets. Mais au lieu de classes avec des méthodes, ce sont des structures et des fonctions qui fonctionnent sur une structure.


0 commentaires

0
votes

0 commentaires

1
votes

Juste parce que c'est C ne signifie pas que ce n'est pas orienté objet. Voir Cette question ou un nombre de questions nommé avec une variation de "l'apprentissage C venant de fond orienté objet".

Les techniques telles que ceci sont encore utilisées aujourd'hui - GIMP est construite sur GTK + , qui comprend le Bibliothèque GOBJECT pour codage orienté objet dans C. Ce n'est peut-être pas le meilleur moyen et peut ne pas être "idiomatique" c, mais cela peut vous aider.

L'autre conseil que j'ai sur la manière de contrôler la maintenabilité dans un grand projet est Utiliser des bibliothèques. C n'a pas beaucoup d'intégré, donc plus la fonctionnalité que vous puissiez sortir d'un portable ( Open Source?) Library tiers, moins le code vous dois écrire (et donc maintenir).

gtk + a une nouvelle fois Glib , qui est une bibliothèque de captures avec beaucoup de Caractéristiques que les personnes se sont retrouvées à la mise en œuvre et à la réinvestissement dans C. Apache possèdent son propre, le Apache Portable Runtime , qui fait quelque chose de très similaire (mais avec différents types de fonctions). Il existe également quelques bibliothèques de chaîne, ce qui vous sauvera probablement beaucoup de maux de tête et de nombreuses bibliothèques à usage spécial (readline pour des invites interactives, ncurses pour les interfaces textuelles telles que VI, etc.) qui sont utiles mais peuvent ne pas jouer un rôle énorme dans votre application particulière.

Les meilleurs choix dépendent de leur diplôme sur ce que vous écrivez. Si vous écrivez un noyau de système d'exploitation ou un pilote de périphérique ou une application de systèmes intégrés, ignorez tous les conseils ci-dessus. Si vous souhaitez implémenter un langage de programmation, consultez flex et bison < / Code> Pour commencer avec Grammars sur quelques projets de test plus petits, mais je vous recommande de rouler votre propre analyseur et Lexer pour un projet sérieux (si, sans autre raison que l'amélioration des rapports d'erreur).


0 commentaires

2
votes

Je recommanderais de scinder votre projet dans les composants plus petits et placez chaque composant dans son propre fichier .c et .h. Vous placez le code dans le fichier .C et les structures et prototypes dans le fichier .h.

Faire cela, vous pouvez programmer l'objet orienté objet en C si vous gardez vos fonctions réentrantes: dites quelques fonctions effectuent une fonction foo, puis plutôt que d'avoir des variables globales dans foo.c , déclarer Une structure nommée foo dans foo.h et que les fonctions prennent un pointeur sur une structure FOO comme premier paramètre.

Si une fonction Fred () est uniquement utilisée quelque part dans foo.c , marquez-le statique et ne mettez pas le prototype foo.h

En outre, recherchez Google Codesearch pour les projets C pour voir comment cela se fait.


0 commentaires

-1
votes

OO est juste du sucre syntaxique. Les compilateurs C ++ originaux compilés à C. Voici un exemple de base d'environ la même classe de Java et en C:

Point.java
import java.lang.Math;

public class Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int getDistance(Point p)
    {
        return Math.sqrt((p.x - this.x) * (p.x - this.x) + (p.y - this.y) * (p.y - this.y));
    }
}

Point.h
typedef struct __Point Point;
typedef struct __Point
{
    int x, y;
    int (*getDistance)(Point*,Point*);
} Point;

Point* new_Point(int, int);
void delete_Point(Point*);
int getDistance(Point*, Point*);

Point.c
#include <math.h>
#include "Point.h"

Point* new_Point(int x, int y)
{
   Point* this = malloc(sizeof(Point));
   this->x = x;
   this->y = y;
   this->getDistance = getDistance;
}

void delete_Point(Point* this)
{
    free(this);
}

int getDistance(Point* this, Point* p)
{
    return sqrt((p->x - this->x) * (p->x - this->x) + (p->y - this->y) * (p->y - this->y));
}


0 commentaires

0
votes

Quelques suggestions ...

• Utilisez le modificateur statique autant que possible; C'est (principalement) l'équivalent de privé dans les langues OO.

• Essayez de ne pas utiliser trop de variables globales, en particulier si votre programme utilise plusieurs threads.

• Informations relatives au groupe ensemble dans Structs ; Ce sont vos objets en c.

• C n'a pas de manipulation d'exception, vérifiez donc les valeurs de retour de toutes les fonctions système que vous appelez.


0 commentaires