Quelle est la différence entre les deux déclarations suivantes? Je pensais qu'ils étaient équivalents, mais le premier échantillon fonctionne, et le second ne fonctionne pas. Je veux dire qu'il compile et s'exécute, mais le code d'affichage bitmap est vide. Je ne l'ai pas encore franchi, mais ai-je oublié quelque chose d'évident? GUI_BITMAP est une structure simple décrivant un bitmap. C'est pour VC++ 2005, mais je pense qu'il échoue également dans VC++ 2008. Ma tête se grattant celui-ci ...Problème avec le mot clé extern en C++
Exemple 1:
extern "C" const GUI_BITMAP bmkeyA_cap_active;
extern "C" const GUI_BITMAP bmkeyA_cap_inactive;
Exemple 2:
extern "C"
{
const GUI_BITMAP bmkeyA_cap_active;
const GUI_BITMAP bmkeyA_cap_inactive;
};
Edit: Plus a montré que explorer le deuxième exemple crée les struct, tandis que le premier fait référence à des structures externes. Le deuxième exemple devrait échouer à lier, car il existe deux variables à portée globale avec le même nom. Mais ce n'est pas le cas, il envoie une structure remplie à zéro au code d'affichage qui abandonne. Hmmm .....
Édition 2: L'exécution du même code par l'intermédiaire d'un autre compilateur (IAR) n'a pas réussi à compiler sur l'exemple 2, avec une erreur sur l'absence d'un constructeur par défaut. Donc je devine qu'il y a quelque chose de subtil sur le mot-clé "extern", les structures, et le C++ que je ne comprends pas. Si les choses dans la zone externe étaient fonctions les deux échantillons seraient identiques non?
Merci pour la réponse, mais il n'y a pas d'objets de bibliothèque en cours d'utilisation ici, ce n'est que mon code, un mélange de C et C++. Ma question initiale demeure - quelle est la différence entre l'échantillon 1 et l'échantillon 2 - je pensais qu'ils devraient générer exactement le même code? Si les choses étaient des fonctions au lieu de structures - ce sont les mêmes choses, n'est-ce pas? – Jeff
@Jeff, la réponse rapide à votre question est que non, ces deux ne sont pas les mêmes, ce qui explique pourquoi vous voyez des problèmes.Dans le second cas, vous modifiez uniquement les instructions dans '{}' pour utiliser les conventions de liaison de C. Dans le premier exemple, vous faites cela * plus * indiquant que les variables sont déclarées ailleurs. http://msdn.microsoft.com/en-us/library/0603949d(VS.80).aspx –