2010-02-03 11 views
37

Puis-je mélanger extern et const, comme extern const? Si oui, le qualificatif const impose-t-il son règne uniquement dans la portée dans laquelle il est déclaré ou doit-il correspondre exactement à la déclaration de l'unité de traduction dans laquelle il est déclaré? C'est à dire. puis-je déclarer dire extern const int i; même lorsque le n'est pas un const et vice versa?Mélange extern et const

+3

Cette question n'est pas directement à propos de la vôtre, mais a toutes les informations requises: http://stackoverflow.com/questions/2151831/non-integral-constants/2151876#2151876 – GManNickG

+0

Permettez-moi de mentionner la différence de liaison ici : Utiliser 'extern' avec' const' désactivera const-fold et forcera le compilateur à allouer de la mémoire pour la constante, ce qui n'aurait pas été le cas autrement, où il fera la substitution inplace (après pliage, si possible). [donc ce n'est pas conseillé, et j'ai décidé de ne pas l'utiliser :)] – legends2k

+0

si c'est une constante, pourquoi le compilateur désactiverait-il le repliement constant en cas d'extern? – Jimm

Répondre

33
  • Oui, vous pouvez les utiliser ensemble. .
  • Et oui, il la déclaration dans l'unité de traduction, il est effectivement déclaré en moins bien sûr que vous participez à la Underhanded C Programming Contest :-)

Le schéma habituel est doit correspondre exactement:

  • fichier.h:
    extern const int a_global_var;
  • file.c:
    #include "file.h"
    const int a_global_var = /* some const expression */;

Éditer: Commentaire de légendes2k Incorporated. Merci.

+0

Voulez-vous dire const 'int a_global_var = ;'? – legends2k

+1

Je ne pouvais rien faire du bénéfice d'un const externe, et il m'est apparu que cela permettrait d'économiser gros temps sur la compilation lors de la modification des constantes. Merci – doron

+22

Um, puisque 'const' est implicitement' static', vous avez besoin d'un 'extern' même dans la définition' a_global_var' (dans * file.c *). Sans cela, tout ce qui inclut * file.h * ne sera pas lié car il cherche un 'const int a_global_var' avec un lien externe. –

0

Oui, vous pouvez les utiliser ensemble.

Si vous déclarez "extern const int i", alors i est const sur toute sa portée. Il est impossible de le redéfinir comme non-const. Bien sûr, vous pouvez ignorer le drapeau const en le rejetant (en utilisant const_cast).

1

Vous pouvez les utiliser ensemble et vous pouvez faire toutes sortes de choses qui ignorent le mot-clé const, parce que c'est tout; un mot-clé. Il indique au compilateur que vous ne changerez pas une variable qui à son tour permet au compilateur de faire quelques optomisations utiles et vous empêche de changer des choses que vous ne vouliez pas faire.

Possibility.com a a decent article avec un peu plus d'arrière-plan.

5

Vous pouvez les utiliser ensemble. Mais vous devez être cohérent sur votre utilisation de const car lorsque C++ nomme la décoration, const est inclus dans les informations de type utilisées pour décorer les noms des symboles. donc extern const int i fera référence à une variable différente de extern int i

Sauf si vous utilisez extern "C" {}. C décoration de nom ne fait pas attention à const.