2016-01-02 1 views

Répondre

5

la norme du C permet pointeurs à affecter en tant que constante la valeur 0.

Toutefois, le code:

int null = 0; 
int *p = null; 

ne fixe pas à la p0 constante, il lui affecte la valeur de null, qui est une variable entière.

Si nous généralisons un peu, et mettons int null = 0; sur une ligne, et int *p = null; dans une ligne complètement différente, avec du code entre les deux. Cependant, je ne pense pas que ce soit la raison principale pour ne pas autoriser cela, mais plutôt qu'il est plus facile d'écrire un compilateur qui vérifie "est-ce la constante entière? 0 "que" est cette constante nommée de la valeur zéro ". Que faire si la constante provient d'une autre unité de compilation (une constante de temps de liaison)?

En outre, lire 0 est beaucoup plus facile que d'avoir 46 normes de codage différentes, dont chacune utilise un nom différent pour null.

Notez que même si vous faites const int null = 0;, il est toujours pas la 0 constante - c'est une constante de la même valeur que 0, mais pas le même, lexicalement, comme 0.

+1

La partie filetée n'est-elle pas un hareng rouge? C'est encore illégal même si 'null' est un' constexpr'. – Cornstalks

+1

@Cornstalks: Je ne suis pas entièrement sûr de la motivation réelle, mais il est clair que si le compilateur DID autorisait la variante non-const, ce serait un problème. Et j'ajoutais simplement 'const int null = 0;' quand vous avez écrit ce commentaire. –

+1

Bien sûr, je pense juste essayer d'utiliser des discussions car la justification est généralement incorrecte. Le compilateur peut supposer que 'null' est 0 dans l'instruction' int * p = null; '. Si un thread avait interrompu l'exécution et défini 'null' sur quelque chose, ce serait un comportement indéfini pour l'autre thread de continuer l'exécution et de lire' null' (une barrière de synchronisation de la mémoire serait nécessaire). – Cornstalks

5

Si vous essayez de compiler ce code, alors vous devriez obtenir l'erreur suivante:

error: cannot initialize a variable of type 'int *' with an lvalue of type 'int' 

Essentiellement ce qui se passe est que vous essayez d'initialiser un pointeur à une variable. La seule chose qui est permise en C++ est d'assigner un pointeur directement à un zéro.

int * p = 0; 

Quelque chose comme l'exemple ci-dessus fonctionnerait.