
Ma prof de prog vient de me dire que l'utilisation des constantes avec #define est dépassé, meme plus standard..
à ce qu'il parrait il faut maintenant utiliser des vars const, et c tout.
ça me parrait franchement neu²..
c vrai ??
Note : On fera une distinction bien nette entre les constantes de compilation définies avec la directive #define du préprocesseur et les constantes définies avec le mot-clé const. En effet, les constantes littérales ne réservent pas de mémoire. Ce sont des valeurs immédiates, définies par le compilateur. En revanche, les variables de classe de stockage const peuvent malgré tout avoir une place mémoire réservée. Ce peut par exemple être le cas si l'on manipule leur adresse ou s'il ne s'agit pas de vraies constantes, par exemple si elles peuvent être modifiées par l'environnement (dans ce cas, elles doivent être déclarées avec la classe de stockage volatile). Ce sont donc plus des variables accessibles en lecture seule que des constantes. On ne pourra jamais supposer qu'une variable ne change pas de valeur sous prétexte qu'elle a la classe de stockage const, alors qu'évidemment, une constante littérale déclarée avec la directive #define du préprocesseur conservera toujours sa valeur (pourvu qu'on ne la redéfinisse pas). Par ailleurs, les constantes littérales n'ont pas de type, ce qui peut être très gênant et source d'erreur. On réservera donc leur emploi uniquement pour les constantes de compilation, et on préférera le mot-clé const pour toutes les autres constantes du programme.
Pen^2
a écrit : Ma prof de prog vient de me dire que l'utilisation des constantes avec #define est dépassé, meme plus standard..
godzil a écrit :
Par contre la ou c discutable c entre un #define et un enum :
#define VER_MINOR = 0
#defube VER_MAJOR = 1
ou
enum {
VER_MAJOR = 1,
VER_MINOR = 0
}
La par contre c'est dicutable
#define ABC 0 #define ABD 1 #define ABE 2 #define ABF 3 #define ABG 4
enum e_truc { ABC = 0, ABD, ABE, ABF, ABG, MAX };
typedef enum { TOTO, TITI, TATA } e_num; e_num a; /* a peut prendre comme valeur TOTO, TITI ou TATA */ e_num foo(int i) { switch(i) { case 0: return TOTO; case 1: return TITI; default: case 2: return TATA; } }