#define dans une fonction ...

#define dans une fonction ... - C - Programmation

Marsh Posté le 08-12-2006 à 15:41:17    

...se fesse ?? est-ce utile ou dangereux ?
 
merci par avance  :love:

Reply

Marsh Posté le 08-12-2006 à 15:41:17   

Reply

Marsh Posté le 08-12-2006 à 15:56:37    

ca n'a pas de rapport avec la fonction. Au moment où la fonction est compilée, le #define a déjà été remplacé les directives en # ont déjà été remplacées comme il se doit par le pré-processeur

Message cité 1 fois
Message édité par theshockwave le 08-12-2006 à 15:58:10
Reply

Marsh Posté le 08-12-2006 à 16:03:39    

theshockwave a écrit :

ca n'a pas de rapport avec la fonction. Au moment où la fonction est compilée, le #define a déjà été remplacé les directives en # ont déjà été remplacées comme il se doit par le pré-processeur


 
 
Uniquement pour le code qui suit la directive, celui qui le précède n'est pas affecté :

$ cat v1.c
#include <stdio.h>
 
int main(void)
{
   printf("its teh lolilol : %s\n", TUPEUXPASTEST);
#define TUPEUXPASTEST "bidulotruc"
   printf("ahah ur teh pwned : %s\n", TUPEUXPASTEST);
 
   return 0;
}
$ gcc -W -Wall -O2 -pedantic v1.c
v1.c: In function `main':
v1.c:6: error: `TUPEUXPASTEST' undeclared (first use in this function)
v1.c:6: error: (Each undeclared identifier is reported only once
v1.c:6: error: for each function it appears in.)
 


 
 

$ cat v2.c
#include <stdio.h>
 
int main(void)
{
#define TUPEUXPASTEST "bidulotruc"
   printf("its teh lolilol : %s\n", TUPEUXPASTEST);
   printf("ahah ur teh pwned : %s\n", TUPEUXPASTEST);
 
   return 0;
}
$ gcc -W -Wall -O2 -pedantic v2.c
 


 
 
 
 
 
J'ai déjà utilisé un #define en milieu de fonction, pour définir une macro temporaire.
 
Genre au lieu d'écrire, pour une raison x ou y, un truc genre structure.variable.indice.bidule.chose 10 fois dans une fonction, je tape un truc genre :

#define MACHIN structure.variable.indice.bidule.chose
 
<...utilisation de MACHIN à toutes les sauces ...>
 
#undef MACHIN


 
(l'exemple que je donne ici n'est pas des plus représentatifs, j'ai pas de bon exemple en tête)

Reply

Marsh Posté le 08-12-2006 à 16:15:14    

Elmoricq a écrit :

Uniquement pour le code qui suit la directive, celui qui le précède n'est pas affecté :

$ cat v1.c
#include <stdio.h>

 

int main(void)
{
   printf("its teh lolilol : %s\n", TUPEUXPASTEST);
#define TUPEUXPASTEST "bidulotruc"
   printf("ahah ur teh pwned : %s\n", TUPEUXPASTEST);

 

  return 0;
}
$ gcc -W -Wall -O2 -pedantic v1.c
v1.c: In function `main':
v1.c:6: error: `TUPEUXPASTEST' undeclared (first use in this function)
v1.c:6: error: (Each undeclared identifier is reported only once
v1.c:6: error: for each function it appears in.)

 
 


$ cat v2.c
#include <stdio.h>

 

int main(void)
{
#define TUPEUXPASTEST "bidulotruc"
   printf("its teh lolilol : %s\n", TUPEUXPASTEST);
   printf("ahah ur teh pwned : %s\n", TUPEUXPASTEST);

 

  return 0;
}
$ gcc -W -Wall -O2 -pedantic v2.c

 
   

J'ai déjà utilisé un #define en milieu de fonction, pour définir une macro temporaire.

 

Genre au lieu d'écrire, pour une raison x ou y, un truc genre structure.variable.indice.bidule.chose 10 fois dans une fonction, je tape un truc genre :

#define MACHIN structure.variable.indice.bidule.chose

 

<...utilisation de MACHIN à toutes les sauces ...>

 

#undef MACHIN

 

(l'exemple que je donne ici n'est pas des plus représentatifs, j'ai pas de bon exemple en tête)

 

undef c important ? je veux dire si on l'oublie est ce que notre programme fait comme dans wars et declare la guerre à la Russie en envoyant un missile nucléaire ??


Message édité par in_your_phion le 08-12-2006 à 16:15:53
Reply

Marsh Posté le 08-12-2006 à 16:29:21    

Non, ce n'est pas important. Seulement voila, à partir du moment où tu définis une macro propre à un bloc de code en particulier, en dehors de ce bloc la macro n'a plus lieu d'être.

Message cité 1 fois
Message édité par Elmoricq le 08-12-2006 à 16:29:42
Reply

Marsh Posté le 08-12-2006 à 16:32:45    

Elmoricq a écrit :

Non, ce n'est pas important. Seulement voila, à partir du moment où tu définis une macro propre à un bloc de code en particulier, en dehors de ce bloc la macro n'a plus lieu d'être.


 
ok, merci   [:arg]  :hello:

Reply

Marsh Posté le 08-12-2006 à 16:54:27    

Elmoricq a écrit :

Uniquement pour le code qui suit la directive, celui qui le précède n'est pas affecté :

$ cat v1.c
#include <stdio.h>
 
int main(void)
{
   printf("its teh lolilol : %s\n", TUPEUXPASTEST);
#define TUPEUXPASTEST "bidulotruc"
   printf("ahah ur teh pwned : %s\n", TUPEUXPASTEST);
 
   return 0;
}
$ gcc -W -Wall -O2 -pedantic v1.c
v1.c: In function `main':
v1.c:6: error: `TUPEUXPASTEST' undeclared (first use in this function)
v1.c:6: error: (Each undeclared identifier is reported only once
v1.c:6: error: for each function it appears in.)
 




 
ce n'est pas pour autant qu'il y a un rapport avec le fait qu'on soit dans un bloc de fonction. Cette "contrainte" évidente s'applique partout.

Reply

Marsh Posté le 08-12-2006 à 17:04:52    

theshockwave a écrit :

ce n'est pas pour autant qu'il y a un rapport avec le fait qu'on soit dans un bloc de fonction. Cette "contrainte" évidente s'applique partout.


En effet, c'est pour ça d'ailleurs que je ne l'indente pas comme la fonction.
Je voulais plus compléter ton message qu'autre chose. [:dawa]

Reply

Marsh Posté le 09-12-2006 à 01:06:19    

in_your_phion a écrit :

...se fesse ?? est-ce utile ou dangereux ?
 
merci par avance  :love:


Tu peux définir une macro n'importe où (sur une ligne bien à elle quand même).
Elle sera valide jusqu'au prochain #undef de la même macro ou la fin du source.
 
Il m'arrive de définir des macros 'jetables' comme ceci :  

Code :
  1. int f(int a)
  2. {
  3. #define XXX xxx
  4.    reste du code...
  5. #undef XXX
  6. }


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-12-2006 à 01:50:16    

Juste pour dire que #define/#undef ne remet évidemment pas la macro à la valeur qu'elle avait avant de #define (si elle était déja définie).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed