81 votes

#define vs const en Objective-C

Je suis nouveau dans Objective-C et j'ai quelques questions concernant const et la directive de prétraitement #define .

Tout d'abord, j'ai constaté qu'il n'était pas possible de définir le type de constante à l'aide de #define . Pourquoi donc?

Deuxièmement, existe-t-il des avantages à utiliser l’un par rapport à l’autre?

Enfin, quelle voie est la plus efficace et / ou la plus sûre?

106voto

JeremyP Points 46808

Tout d'abord, j'ai trouvé que ce n'est pas possible de définir le type de la constante à l'aide de #define, pourquoi est-ce?

Pourquoi est-ce? Ce n'est pas vrai:

#define MY_INT_CONSTANT ((int) 12345)

Deuxièmement, quels sont les avantages à utiliser l'un d'eux sur l'autre?

Oui. #define définit une macro qui est remplacé, même avant la compilation commence. const seulement modifie une variable de sorte que le compilateur signalera une erreur si vous essayez de le changer. Il y a des contextes dans lesquels vous pouvez utiliser un #define mais vous ne pouvez pas utiliser un const (bien que j'ai du mal à en trouver un à l'aide de la dernière clang). En théorie, un const prend de la place dans le fichier exécutable et nécessite une référence à la mémoire, mais dans la pratique, il est minime et peut être optimisé par le compilateur.

consts sont beaucoup plus compilateur et débogueur de l'environnement qu' #defines. Dans la plupart des cas, c'est le principal point que vous devriez considérer lors de la prise d'une décision sur laquelle utiliser.

Juste pensé à un contexte dans lequel vous pouvez utiliser #define mais pas const. Si vous avez une constante que vous souhaitez utiliser dans beaucoup d' .c fichiers, avec un #define vous venez de le coller dans un en-tête. Avec un const vous devez avoir une définition dans un fichier C et

// in a C file
const int MY_INT_CONST = 12345;

// in a header
extern const int MY_INT_CONST;

dans un en-tête. MY_INT_CONST ne peuvent pas être utilisés comme la taille d'un statique ou étendue globale tableau dans une C fichier à l'exception de celui sur lequel il est défini.

Cependant, pour des constantes entières, vous pouvez utiliser un enum. En fait, c'est ce qu'Apple a fait à peu près invariablement. Il possède tous les avantages des deux #defines et consts, mais ne fonctionne que pour les constantes entières.

// In a header
enum
{
    MY_INT_CONST = 12345,
};

Enfin, ce qui est plus efficace et/ou plus sécurisé?

#define est plus efficace en théorie, bien que, comme je l'ai dit, les compilateurs modernes probablement s'assurer qu'il existe peu de différence. #define est plus sûr en fait que c'est toujours une erreur de compilateur pour essayer de lui attribuer

#define FOO 5

// ....

FOO = 6;   // Always a syntax error

consts pouvez être trompés en être affecté, bien que le compilateur peut émettre des avertissements:

const int FOO = 5;

// ...

(int) FOO = 6;     // Can make this compile

Selon la plate-forme, la cession pourrait encore échouer au moment de l'exécution si la constante est placé dans une lecture que l'segment et c'est officiellement le comportement indéfini selon la norme.

Personnellement, pour des constantes entières, j'ai toujours utiliser enums pour les constantes d'autres types, j'utilise const , à moins que j'ai une très bonne raison de ne pas.

16voto

MegaNairda Points 301

A partir d'un codeur C:

Une variable constante est simplement une variable dont le contenu ne peut pas être modifié.

Cependant, #define est un préprocesseur qui remplace toute instance par ce dernier.

Donc, si vous #define defTest 5;

Tous les defTest de votre code seront remplacés par 5 lors de la compilation.

11voto

boubou Points 90

Il est important de comprendre la différence entre le #define et la const instructions qui ne sont pas destinés à la même chose.

Const est utilisé pour générer un objet de la demande type qui sera, une fois initialisé, constante. Cela signifie que c'est un objet dans la mémoire du programme et peut être utilisé en readonly. L'objet est généré à chaque fois que le programme est lancé.

Définir est utilisé afin de faciliter la lisibilité du code et des modifications ultérieures. Lors de l'utilisation d'une définition, vous ne masque une valeur derrière un nom. Donc lorsque l'on travaille avec un rectangle, vous pouvez définir la largeur et la hauteur avec les valeurs correspondantes. Ensuite, dans le code, ça sera plus facile à lire puisqu'au lieu de numéros, il y aura des noms. Si plus tard vous décidez de changer la valeur de la largeur, vous n'avez qu'à le modifier dans la définir à la place d'un ennuyeux et dangereux rechercher/remplacer dans l'ensemble de votre fichier. Lors de la compilation, le préprocesseur remplace tous les nom défini par les valeurs dans le code. Par conséquent, il n'y a pas de temps à perdre à les utiliser.

7voto

Ed Heal Points 24309

En plus des commentaires des autres peuples, les erreurs utilisant #define sont notoirement difficiles à déboguer car le pré-processeur les récupère avant le compilateur.

2voto

Luchian Grigore Points 136646

Depuis le pré-processeur directives sont mal vus, je vous suggère d'utiliser un const. Vous ne pouvez pas spécifier un type avec un pré-processeur, car un pré-processeur de la directive est résolu avant la compilation. Eh bien, vous pouvez, mais quelque chose comme:

#define DEFINE_INT(name,value) const int name = value;

et l'utiliser comme

DEFINE_INT(x,42) 

ce qui serait perçu par le compilateur comme

const int x = 42;

Tout d'abord, j'ai trouvé que ce n'est pas possible de définir le type de la constante à l'aide de #define, pourquoi est-ce?

Vous pouvez voir mon premier extrait.

Deuxièmement, quels sont les avantages à utiliser l'un d'eux sur l'autre?

Ayant généralement une const au lieu d'un pré-processeur de la directive permet le débogage, pas autant dans ce cas (mais encore?).

Enfin, ce qui est plus efficace et/ou plus sécurisé?

Les deux sont aussi efficaces. Je dirais que la macro peut potentiellement être plus sûr, car il ne peut pas être modifié au cours de l'exécution, alors qu'une variable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X