2017-02-27 2 views
0

J'ai une solution de studio visuel qui contient divers projets C++. Pour la simplicité, il y a deux projets. Un pour .lib et un autre pour .exe. Les deux utilisent l'en-tête précompilé du projet stdafx.h. Mais l'en-tête précompilé est partagé entre les projets.définition de variable dans stdafx.cpp

Récemment quelqu'un placé définition de variable à l'intérieur stdafx.cpp et parce qu'il est partagé entre les projets que j'ai obtenu: error LNK2005: "int x" ([email protected]@3HA) already defined in stdafx.obj

Ma question est la suivante: est-il autorisé à mettre en définitions tête précompilés? (dans la partie cpp à partir de laquelle l'en-tête précompilé est créé)

Je suppose que l'en-tête précompilé ne doit contenir que des déclarations de symboles et non des définitions. Ou ai-je tort?

+1

En général, vous ne souhaitez pas définir une variable dans l'en-tête * de *. Chaque englobant de cet entête prendra la définition et l'éditeur de liens lancera un ajustement. – user4581301

+1

Je déconseille d'utiliser des en-têtes précompilés à moins que la construction de votre programme prenne beaucoup de temps (comme les minutes). OMI, votre programme devrait être structuré de sorte que seulement quelques fichiers sont modifiés à la fois. La plupart des fichiers ne devraient pas être modifiés, il y a donc moins de compilations; Ainsi, le temps de construction est court. –

+0

Ne partagez pas les en-têtes précompilés entre projets, sauf si vous pouvez garantir que les paramètres de construction du projet dans les deux projets sont identiques et resteront identiques –

Répondre

2

Généralement, vous ne voulez pas définir de variable dans un en-tête.

Lorsqu'un en-tête est inclus, il est effectivement collé dans le fichier inclus avant le début de la compilation. Cela signifie que tout ce qui est défini dans l'en-tête sera répété dans tous les fichiers, y compris l'en-tête. Cela compile habituellement très bien, mais laisse le lieur avec le problème de déterminer quelle définition est la vraie définition.

Si tout le monde est de partager un seul x, placez

extern int x; 

dans un en-tête et

int x; 

dans un fichier cpp approprié.

Si chaque includer est d'avoir leur propre privé x

static int x; 

va dans l'en-tête, mais personnellement je vois cela comme une esquive laide que vous devriez essayer de contourner. Quant à savoir s'il est légal de mettre d'autres choses que les en-têtes que vous voulez précompiler dans stdafx ou non, honnêtement, je ne sais pas. Je ne l'ai jamais fait. Je sais que ce n'est pas la façon dont stdafx.h est destiné à être utilisé, vous voulez seulement mettre des en-têtes de bibliothèques qui ne seront pas modifiées dans le cadre du projet dans stdafx.h, donc je ne le ferais pas.

Lecture recommandée: Purpose of stdafx.h, What's the use for "stdafx.h" in Visual Studio? et How to use stdafx.h properly?