user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 26-12-2013 18:50:41

WarLocG
#! modo de compet

Compilation d'astuces en langage C

Désactiver des bouts de code

[== C++ ==]
#if 0
 ....
#endif

Le code entre #if 0 et #endif sera ignoré.

Utiliser des macros

* Utiliser les macro en multifichier pour éviter de redéclarer plusieurs fois les même types, variables et fonctions.

[== C++ ==]
/* fichier1.c */
#include <stdio.h>
#include "fichier2.c"

#if not defined __FICHIER1__
#define __FICHIER1__

int a; // deja declaré dans fichier2.c -> source de conflit
char* b; // deja declaré dans fichier2.c -> source de conflit
float c; // deja declaré dans fichier2.c -> source de conflit

...

int main(){
   ...
   return 0;
}

#endif

/* fichier2.c */
#include <stdio.h>

#if not defined __FICHIER2__
#define __FICHIER2__

int a; /* defini globalement ici et inclus dans fichier1.c via #include */
char* b; /* defini globalement ici et inclus dans fichier1.c via #include */
float c; /* defini globalement ici et inclus dans fichier1.c via #include */

...

void uneProcedure(){};
int uneFonction(){return a;};

#endif

dans la meme mesure en multifchier, si on est sur et certain que un type, une variable ou une fonction dois etre uilisé et qu'elle existera dans une des bibliothèques utilisées, on peut précéder un type ou une fonction par extern, cela indique qu'ils sont déja déclarés ailleurs dans le projet.

[== C++ ==]
...
extern int x,y;
...
extern void fabriquerMenu(int x, int y);
...

* Créer des macros pour se faciliter la vie avec les messages d'erreurs répétés.

[== C++ ==]
...
#define ERROR_IO_CANNOTREADFILE "Le fichier n'exite pas ou ne peut être lu."
...
fprintf(stderr,"%s",ERROR_IO_CANNOTREADFILE);
exit(-1);
...

* Macro de test booléenne (format chaîne de caractère personnalisable)

[== C++ ==]
#define TEST(a) (a)?"vrai":"faux"
...
printf("Est-ce que a == b ? %s",TEST(a==b));
...

On peut aussi faire ceci, au format numérique

[== C++ ==]
#define FALSE 0
#define TRUE 1
#define TEST(a) (a)?TRUE:FALSE

Utilisation de macros spéciales

Détecter le système d'exploitation:
* Windows

[== C++ ==]
#if defined (_WIN32) || defined (__WIN32__)
  ...
#endif

* GNU/Linux

[== C++ ==]
#if defined (__linux__) || defined (linux)
 ...
#endif

Date et heure

[== C++ ==]
printf("on est en %s et il est %s", __DATE__,__TIME__); /* affichera: on est en Dec 26 2013 et il est 19:03:47 (avec date et heure locale évidemment) */

Ceci ne montre que quelques exemples les plus utiles, pour une liste plus exhaustive, c'est par ici:
En rapport avec le système d'exploitation => http://homepage.ntlworld.com/jonathan.d … tform.html
En rapport avec les compilateurs => http://homepage.ntlworld.com/jonathan.d … piler.html
En rapport avec l'architecture processeur => http://homepage.ntlworld.com/jonathan.d … essor.html
Et ici également => http://homepage.ntlworld.com/jonathan.d … guage.html
Beaucoup plus complet ici => http://sourceforge.net/p/predef/wiki/Home/
Les standards (__TIME__, __FILE__, __STDC__, ... etc) => http://gcc.gnu.org/onlinedocs/cpp/Stand … acros.html

---
Ce sujet n'est pas exhaustif et peut être modifié à tout moment.


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

Pied de page des forums