CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Utilisation des DEFINE

Darkandgel
Darkandgel
Niveau 10
26 août 2014 à 17:19:22

Salut a tous, je viens de voir une utilisation de l'instruction de préprocesseur #define en C, et je me demandait quel était son interet.

Je comprend bien qu'elle sert a remplacer une chine de caractere par une autre, mais c'est utilisé de quelle maniere ?

godrik
godrik
Niveau 30
26 août 2014 à 17:29:33

En pratique les defines c'est assez MAL en C. Ca sert principalement a eviter les doubles inclusions de header file.

Apres ca sert aussi pour contourner le fait qu'il n'y a pas de metaprogrammation en C. Et que pendant longtemps il n'y avait pas de fonction inline.

Donc par exemple, ca me sert souvent a activer/desactiver des bouts de code a la compilation (typiquement des message de debuggage, ou des verifications d'erreur). Alors que si je mettais un flag avec "une vraie variable", je payerai quand meme le cout d'une verification.

Darkandgel
Darkandgel
Niveau 10
26 août 2014 à 17:37:33

Ok, c'est tout ce que je voulais savoir.
Merci :p

dark_drow
dark_drow
Niveau 15
26 août 2014 à 18:50:49

j'ai vu quelque bout de code en C qui utilisait des defines pour abréger un peu quelques trucs trop verbeux.

Pseudo supprimé
Pseudo supprimé 27 août 2014 à 08:26:15

quelques cas légitime, selon moi:

-- en C, contrairement a C++, il n'est pas possible d'utiliser un const pour déclarer un tableau global

    const uint size = 8;
    int tab[size]; // invalide

-- passer des arguments implicitement

    #define printf(format_string, ...) fprintf(STDIN, format_string, ...)

-- le standard C dit que toutes chaines de caractères cote a cote sont considérées comme une seule

    printf("x""y""z") est la même chose que printf("xyz")

ca permet des trucs sympas comme

    #define LOG_ERROR(x, ...) printf("ERROR"__LINE__":"x"\n", ...)

-- manipulation de bits. eg: des pages mémoire où la taille est un multiple de 8: les 3 bits inférieur sont toujours a zero et peuvent être utilises pour un tag

    struct mem_page {
        uint size_tag;
        void *address;
    }

    #define PAGE_SIZE(x) (x & -8)
    #define PAGE_TAG(x) (x & 7)

-- plus délicat, faire de l'abstraction sur les structures de données. par exemple un système d'objets ou chaque objet partage des champs communs (un header). ici, utiliser un macro au lieu d'une fonction inline permet d'avoir une l-value.

    struct __header { // cuisine interne, sujet a modification
        uint size;
        uint type_id;
    }

    #define OBJ_HEADER struct __header
    #define OBJ_SIZE(x) (x->__header.size)

    struct obj_int {
        OBJ_HEADER;
        ...
    }

    OBJ_SIZE(foo) = 128; // invalide si OBJ_SIZE est une fonction

Darkandgel
Darkandgel
Niveau 10
27 août 2014 à 09:48:55

Merci pour ces précisions elite, même si je t'avouerai que, n'ayant fait que très peu de C, j'en comprend à peine la moitié ^^

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment