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
Répondre
- 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.
Voulez-vous dire const 'int a_global_var =
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
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. –
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).
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.
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.
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
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
si c'est une constante, pourquoi le compilateur désactiverait-il le repliement constant en cas d'extern? – Jimm