CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

CONNERIE de préprocesseur :@

techslash
techslash
Niveau 8
17 avril 2003 à 02:49:10

J´ai un prob avec le préprocesseur de Visual C++. Je me créer un header dans lequel je déclare 2 variables globales à tous le programme ( à tous mes . cpp, j´en ai seulement 2 présentement) ainsi:

____________________________________

  1. ifndef startupComplete
  2. define startupComplete

WSADATA g_socketInit;
char g_input[100];

  1. endif

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Malgré cette instruction qui devrait normalement définir les variables uniquement une fois, j´obtiens ( lors de la compilation):

evaluatorSheet.obj : error LNK2005: " char * g_input" ( ?g_input@@3PADA) already defined in mainSheet.obj

evaluatorSheet.obj : error LNK2005: " struct WSAData g_socketInit" ( ?g_socketInit@@3UWSAData@@A) already defined in mainSheet.obj

Qu´est-ce que je n´ai pas compris ? ?? =(

Merci...

Kelios
Kelios
Niveau 8
17 avril 2003 à 03:55:07

=)
Le préprocesseur est effectué AVANT la compil´. Et qui dit compil, dit que c´est un fichier à la fois.
Cette technique sert donc à éviter qu´un header soit défini 2 fois DANS LE MÊME CODE SOURCE . cpp

Il sera quand même là une fois dans chaque fichier ou tu aura mis un #include de celui-ci.

De toute façon, ma technique, c´est:
PAS DE VARIABLES DANS LES HEADERS!
Si je souhaite les faire communiquer entre fichiers sources à partir d´un header, je le défini dans mon pricipal fichier source et je le déclare en extern dans mon header.
Une pas si mauvaise habitude.

Kelios
---------

P.S. J´espère ne pas m´être gouré quelque part, j´vais avoir l´air con sinon à te donner des conseils avec une telle assurance! ; P

SuperDindon
SuperDindon
Niveau 8
17 avril 2003 à 06:40:51

Pour les déclarer en externe, c´est simplement:

extern [type] [nom];

JeanYvesYves
JeanYvesYves
Niveau 10
17 avril 2003 à 08:49:29

ben non, je ne pense pas que tu te sois gourré ( Kelios) ( ou alors je me gourre aussi : ), le mot extern est bien pratique pour communiquer : )

Ton erreur ( TechSlash) vient peut etre aussi du fait que tu déclares ta variable globale dans ton fichier . cpp aussi non ?
car s´il dit qu´il y a une erreur dans le . obj, c´est dans le cpp ( cpp compilé = obj pour résumer)
essaie de voir...

Sinon, il est possible que ce soit une erreur de " Makefile", donc sous ton projet visual C++, peut etre as tu fait des redondances...
enfin bon, apres, tout dépend de ta structure de fichiers...

SuperDindon
SuperDindon
Niveau 8
17 avril 2003 à 10:03:22

Ouf, tu vas chercher trop loin JeanYvesYves
Si le compilo dit que l´erreur se situe dans le fichier obj, c´est parce qu´il lit le header avant la déclaration de la variable dans le fichier cpp, c´est tout

techslash
techslash
Niveau 8
17 avril 2003 à 15:09:38

Merci pour votre aide, je vais tester extern ce soir...

arnaud81
arnaud81
Niveau 7
17 avril 2003 à 17:57:43

non dindon.

En compilant, les compilateurs fait la liste de tout les noms de fonctions& et leursadresses respectives, et ce pour chaque fichier cpp.

En linkant, le linker assembler les fichiers compiler et va faire la correspondance nomdefonction/variable avec leurs adresses respectives.

avec ta methode Tech, chaque fichier a une variable de meme nom. Mais quand il s´agira de creer cette variable dans un espace mémoire, il y aura 1 nom de variable pour plusieurs adresses, d´ou le PB : le compilateur ne sait pas laquelle utiliser.

si tu utilise le nom clef " extern", tu informes le compilateur que la variable est déja créée ( donc tu aura forcement cette variable sans le ´extern´ dans un fichier) et par conséquent le compilateur allouera uniquement une variable, puis fera reference a cette adresse.

Par ailleur, supposons que tu as plusieurs fichiers cpp qui utilisent des variables globales de meme nom, mais d´utilités différentes, dans ce cas, on peut utiliser le mot clef " static" devant chacune des variables pour informer le compilateur que cette variable n´est globale que dans le fichier et pas dans l´ensemble du projet.

en résumé :

  • variable globale = variable allouée avec une portée sur tout le projet.
  • variable globale " static" = variable allouée avec une portée sur le fichier compilé uniquement
  • variable globale " extern" = la variable est déjà allouée ailleur. Utiliser l´adresse de celle-ci.

et c´est exactement pareil pour les fonctions.

et speciale dédicace pour dindon : Si le compilo dit que l´erreur se situe dans le fichier obj, c´est parcequ´il a trouvé une référence a cette variable dans ce fichier et dans un autre et le pb se retrouve au linkage. Le fichier compile tres bien tout seul !

SuperDindon
SuperDindon
Niveau 8
18 avril 2003 à 11:04:33

Presque d´accord avec toi, à un petit point près.

Dans le cas de TechSlash, si c´est le linker qui renvoie l´erreur, c´est parce qu´il a déclaré 2 fois ses variables(dans le header et 1 cpp donc), mais dans ce cas le compilateur a compilé le cpp où n´était pas déclarée la variable en premier(mais cela revient au même alors, puisque il lit le header ou elle est déclarée). Le linker trouve donc la variable déclarée dans 2 fichiers obj différents et renvoie l´érreur.

Mais voilà où je veux en venir, s´il avait compilé le cpp où la variable est déclarée avant celui où elle ne l´est pas, ce serait le compilo qui aurait renvoyé une erreur. Les headers ne sont pas des fichiers sources à part entière mais des bouts de code ajoutés aux cpp avec les #include

Tout ça pour dire que c´était 50/50 entre le compilo et le linker . Je me suis bien gouré en confondant les deux mais l´erreur peut exister aussi au niveau du compilo, fin de la parenthèse.

arnaud81
arnaud81
Niveau 7
18 avril 2003 à 11:08:39

chuipo d´accord.

mai je vais pas en rajouter....tout est déja ecris plus haut : )

SuperDindon
SuperDindon
Niveau 8
18 avril 2003 à 11:22:35

Euh ouais moi aussi j´ai un doute
Je vais faire le test

SuperDindon
SuperDindon
Niveau 8
18 avril 2003 à 11:39:19

Bah merde alors
Ce que je savais pas c´est que les préprocesseurs n´étaient utilisés seulement que pour un cpp ( avant d´être rafraîchi), et non pas à l´échelle de l´application, ce qui est en fait super-logique.

( je rougis de honte)

Donc en gros ça veut dire que tout ce que j´ai dit était faux et que j´ai écris 20 lignes pour rien

( je me mets en boule et vais me cacher dans un coin sombre)

Intro pour ceux qui lisent à l´envers: sautez les passages écrits par une dinde, ça peut être mortel pour les âmes sensibles

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment