7
votes

Pointeur sur #define

J'étais juste curieux de savoir s'il est possible d'avoir un pointeur faisant référence à #define constante. Si oui, comment le faire?


4 commentaires

Vous voudrez peut-être consulter Stackoverflow.com/questions/1637332 , qui parle des différences entre définir et constantes.


Vous pouvez utiliser -e (g ++ -e file.cc) pour voir votre fichier après l'étape de prétraitement.


Ditto ce que Julio a dit, pour Visual Studio: Si vous cliquez avec le bouton droit de la souris sur le projet et accédez à C / C ++ -> Préprocesseur, vous pouvez le dire de créer un fichier prétraité, le fichier réel destiné à la compilateur.


Tout le monde a été adressé au problème macro, mais je ne suis pas vraiment suivi même lorsque le const est utilisé. Pourquoi voudriez-vous avoir un pointeur à une constante? En ce qui concerne «comment» - pouvez-vous simplement référence / désexférence à cela comme une autre variable? Y a-t-il un moyen sournois pour changer une constante à l'aide de Pointer Math?


5 Réponses :


11
votes

non, car #define est pour le remplacement du texte, il n'est donc pas une variable que vous pouvez obtenir un pointeur sur - ce que vous voyez est réellement remplacé par la définition du # Définissez avant que le code ne soit transmis au compilateur, il n'y a donc rien à prendre l'adresse de. Si vous avez besoin de l'adresse d'une constante, définissez une variable const à la place (C ++).

Il est généralement considéré comme une bonne pratique d'utiliser des constantes au lieu de macros, en raison du fait qu'ils représentent des variables, avec leurs propres règles et types de données. Les macros sont globales et sans faille, et dans un grand programme peut facilement confondre le lecteur (puisque le lecteur ne voit pas ce qui est en réalité).


5 commentaires

Dans ce cas, pourriez-vous s'il vous plaît expliquer comment #define diffère de const int en C ++? Je sais que les deux ne sont que des lues seulement accessibles et doivent être initialisées tout en étant construits. Y a-t-il une autre différence que le compilateur pourrait comprendre?


#define est littéralement comme à l'aide de la recherche / remplacement, puis de l'alimentation de votre texte au compilateur. Une variable constante est une variable régulière pendant (plutôt qu'auparavant) compilée (avec sa propre portée) qui a une valeur qui ne peut pas changer. Parce qu'un #define macro n'est pas une variable (ce n'est que du texte qui sera remplacé par quelque chose d'autre), rien n'existe lorsque le programme est en cours d'exécution pour que vous preniez l'adresse.


Merci mais je n'ai pas assez de réputation pour vous attribuer des points. Pardon !


Haha pas de problème! Heureux cela aidé. :)


@MaHesh: Ne t'inquiète pas Mahesh; Je lui ai donné +1 au nom de vous: D



3
votes

#define définit une macro. Une macro provoque simplement une séquence de jetons à remplacer par une séquence de jetons différente. Les pointeurs et les macros sont des choses totalement distinctes.

si par " #define constante" Vous voulez dire une macro qui s'étend sur une valeur numérique, la réponse est toujours non, car n'importe où est utilisé la macro est simplement remplacée par cette valeur. Il n'y a aucun moyen d'obtenir un pointeur, par exemple, au nombre 42 .


0 commentaires

13
votes

Le #define La directive est une directive sur le Préprocesseur , ce qui signifie qu'il est invoqué par le préprocesseur avant que tout ne soit même compilé.

Par conséquent, si vous tapez:

#define numéro 100

puis plus tard, vous tapez:

int x = numéro;

Qu'est-ce que votre compilateur voit est simplement:

int x = 100;

C'est fondamentalement comme si vous aviez ouvert votre code source dans un traitement de texte et que vous avez trouvé une trouvaille / remplacée pour remplacer chaque occurrence de "nombre" par "100". Donc, votre compilateur n'a aucune idée de l'existence de numéro . Seul le préprocesseur de pré-compilation sait ce que nombre signifie.

Donc, si vous essayez de prendre l'adresse du numéro , le compilateur pensera que vous essayez d'adopter l'adresse d'une constante littérale entière, qui n'est pas valide.


0 commentaires

0
votes

Non, ce n'est pas possible en C / C ++

Vous pouvez utiliser la directive #define pour donner un nom significatif à une constante dans votre programme

Nous pouvons utiliser sur deux formes.

S'il vous plaît: Voir ce lien

http://msdn.microsoft.com/ EN-US / Bibliothèque / TEAS0593% 28VS.80% 29.aspx

La directive #define peut contenir une définition de type objet ou une définition de type fonction.

iam désolé iam Impossible de fournir une autre clin d'oeil ... S'il vous plaît voir les liens IBM..since ci-dessous j'ai collé Linke Link

u peut avoir une information complète de ci-dessus 2 liens



0
votes

Il existe un moyen de surmonter ce problème: xxx pré>

ou si vous savez que c'est le type, vous pouvez même le faire: P>

int rowPointer = NULL;
getDefinePointer(&rowPointer2);
printf("ROW==%d\n", rowPointer2);


0 commentaires