2009-06-29 13 views
4

Si je déclare en C Je sais dire une constanteC Constantes

« MOIS #define = 12 » cette directive préprocesseur remplacera whereever MOIS est utilisé, mais que vous voulez savoir si une mémoire est allouée à stocker 12 ??, si oui, quelle serait l'étiquette et quel serait le type de données.

Répondre

20

Vous souhaiterez probablement votre définissent comme tels:

 
#define MONTHS 12 

/* some code here... */ 

int payAnnual = payMonthly * MONTHS; 

Pour répondre à votre question, pas de mémoire sera utilisé. Le pré-processeur ignore les concepts tels que les variables et la mémoire. C'est essentiellement un éditeur de texte automatisé. Il remplacera toute occurrence du symbole MONTHS par 12.

Comme le pré-processeur est si bête, il est généralement préférable d'utiliser une variable const. Cela vous donne l'avantage de la vérification de type et peut faciliter la lecture des erreurs du compilateur. Et tant que vous le déclarez statique, la variable sera optimisée. (Si vous ne déclarez pas statique variable globale en C, par défaut, il sera exporté, de sorte que le compilateur ne peut pas optimiser disparaître entièrement.)

 
static const int MONTHS = 12; 
+0

Si vous parlez de C++, les consts ont un lien local et ne sont donc pas "exportés". –

+0

cela me fait juste penser, C++ déclarant un const const statique MONTHS = 12 allouerait la taille de la mémoire int et aura 12 stockés dans ce droit? A la fin de la journée, la constante est constante et quel serait cet avantage en C++ en déclarant const de cette façon où la mémoire est allouée. Je me demandais juste !! – Lakshmi

+2

Le compilateur C++ peut (et va) choisir d'optimiser le const, à condition de ne pas faire quelque chose comme prendre son adresse. Mais si vous voulez poser des questions sur C++, vous feriez mieux de commencer une autre question - C et C++ sont des langages différents. –

9

La syntaxe est en fait:

#define MONTHS 12 

Aucun signe = permis. Et aucune mémoire n'est allouée dans le code compilé pour MONTHS, et il n'a aucun type de données.

+4

Eh bien, je pense que ce serait permis, mais il ne fera pas ce qu'il a l'intention de faire avec :-). – Joey

+0

Avec le signe =, gcc émet au moins un avertissement. –

+1

@Neil, notez l'espace après MOIS dans sa question. –

3

Aucune mémoire n'est allouée pour les symboles du préprocesseur. Si vous l'utilisez jamais comme valeur quelque part, cela peut entraîner une allocation pertinente.

Par exemple:

char something[1024*MONTHS];// 1024*12 bytes 

sinon la constante du temps ne survive de compilation. Et il n'a pas de type de données.

3

N'est pas #define - trouve simplement n remplacé par le préprocesseur avant qu'il n'atteigne l'étape de compilation. Il remplace toutes les instances du symbole par la valeur dans la source. Ensuite, le compilateur prend le relais.
Donc, ne pense pas que la mémoire est allouée.

3

Tout le point sur le pré-processeur C est qu'il fait ses remplacements avant que tout code est compilé. donc les constantes # -defined ne sont pas stockées au point où elles sont définies, seulement quand elles sont utilisées.

+0

Je pensais que le but était de rendre le programme compilable au maximum plus grand en séparant la compilation en plusieurs étapes. –

+0

@marco Cela n'a rien à voir avec le pré-processeur. Les langages comme Delphi, qui n'ont pas de préprocesseur supportent la compilation séparée. –

+0

Avoir un préprocesseur augmente encore la taille maximale d'une unité de compilation en ayant moins de symboles dans le compilateur principal. Et la liaison peut être faite par étapes pour garder la mémoire vers le bas. Pensez très tôt aux systèmes Unix (PDP-7 et 11 etc) ici. –

2

Ils sont utilisés comme un entier réel, et le type littéral normal pour un entier est utilisé dans les calculs où le nom de la macro apparaît dans le programme.

comme si vous deviez déclarer

#define FOO "bar" 

Alors occurences de FOO seraient remplacées par l'utilisation typique de « bar » étant un pointeur vers un emplacement de la chaîne constante dans le fichier objet du programme mis en correspondance Mémoire.

Il n'y a pas vraiment de différence.

6

Le préprocesseur apporte simplement des modifications symboliques au code source. Par conséquent, le code se comporterait comme si vous aviez simplement remplacé toutes les occurrences de MONTHS par 12 vous-même. Et par conséquent, il n'y a pas d'impact sur la mémoire en l'utilisant.

L'utilisation de définitions de pré-compilateur est un excellent moyen d'élever le niveau d'abstraction de votre code sans mémoire d'impact sur les performances.

Cordialement

0

Non,

weeks = 12 * 4; 

est exactement la même chose que:

weeks = MONTHS * 4; 

Est-ce que prendre mémoire? Non, Donc non plus MOIS.

0

si 12 est affectée dépend de l'utilisation et n'a rien à voir avec le préprocesseur du tout

Somefunction(MONTH); 

élargirait à

Somefunction(12); 

12 ici doivent ofc être stockés quelque part, dans cette cas il sera statiquement stocké dans l'exécutable. Le type dépendra probablement de ce que Somefunction prendra comme argument (ou de ce que le compilateur décidera le mieux pour cet usage). Il n'y a pas d'étiquette connue pour '12'.

Le pré-traitement est effectué avant la compilation proprement dite, comme quelqu'un l'a déjà écrit, c'est comme un texteditor automatisé. La phase de compilation ignore donc complètement ce que le préprocesseur a fait.

Questions connexes