• [^] # Re: Pourquoi un tiret bas?

    Posté par . En réponse au journal C✙✙ Le tiret bas (underscore) au début des variables membres ?. Évalué à 2.

    Spolsky a des défauts, mais les langages qu'il utilise sont ceux de son industrie (il fait des trucs Web, donc il faut penser PHP, JavaScript, ASP, .Net, etc.).

    J'aime bien le typage statique, mais ça n'empêche pas qu'il existe des cas compliqués ou à la marge. Par exemple : programmation parallèle en mémoire partagée. C'est pour ça que j'aime préfixer mes variables quand elles sortent du contexte « normal » qu'on s'attend à trouver. Par exemple :

    #include <pthread.h>
    #include <stdio.h>
    #include <stdint.h>
    #define N 100ul
    volatile int g_COUNTER;
    typedef struct { 
     int id;
    } id_t;
    void* worker(void* arg) {
     id_t id = (id_t*) arg;
    /* Façon très mauvaise de créer une section critique dans le cas général */
     while (g_COUNTER != id->id)
     ; //nothing
     ++g_COUNTER;
     return 0;
    }
    int main(void)
    {
     pthread_t threads[N];
     id_t ids[N];
     for (size_t i = 0; i < N; ++i) {
     ids[i].id = N-i-1;
     if (0 != pthread_create(threads+i, NULL, worker, ids+i))
     abort(); // pour faire simple
     }
     for (size_t i = 0; i < N; ++i)
     if (0 != pthread_wait(threads[i], NULL))
     abort(); // pour faire simple
     printf("counter = %d\n", g_COUNTER);
    }

    Dans ce contexte, presque tout suit une convention de nommage classique, mais mes macros sont écrites en majuscules pour bien montrer qu'on parle de constantes (N), et pour mes variables globales, je préfixe par g_ ET je mets en majuscules, parce que dans un contexte multi-threadé, on ne met jamais trop d'avertissements dans le nom de la variable pour qu'on se souvienne qu'il faut faire attention ⇒ g_COUNTER.