Springen naar inhoud

Define in c.


  • Log in om te kunnen reageren

#1

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 29 augustus 2008 - 18:46

Soms heb je in c code het volgende:

#define JSMITH

#ifndef JSMITH
/* empty the catalog */
clearpartslist();
/* reload catalog from updated master file */
loadpartslist();
#endif

Hoe is nu JSMITH gedefinieerd? wat is het nu?
als je hebt define true 1 dan weet je dat je compiler true mag vervangen door 1 maar wat in het geval JSMITH?

Groeten.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Burgie

    Burgie


  • >250 berichten
  • 582 berichten
  • Ervaren gebruiker

Geplaatst op 29 augustus 2008 - 22:00

Je kan inderdaad de boodschap geven aan de zogenaamde preprocessor om een identifier in de source code te vervangen door een volgende constructie:
#define identifier replacement

Wat jij daar vermeldt, wordt meestal gebruikt in "conditional inclusions". Als je een voorbeeld wilt kun je even een kijkje nemen in enkele header files die bij je compiler horen.

Voorbeeld: wanneer ik in de file "windows.h" kijk dan merk ik daar het volgende...
#ifndef _WINUSER_H
#include <winuser.h>
#endif
Menselijke vertaling: als de identifier _WINUSER_H niet gedefinieerd is, voeg de header file "winuser.h" in. Als je vervolgens de file "winuser.h" opzoekt, dan zijn de eerste regels die je ziet:
#ifndef _WINUSER_H
#define _WINUSER_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif
Zonder in detail te treden definieert men hier dus de identifier _WINUSER_H, en weet de compiler dus zo dat de header file "winuser.h" is ingevoegd.

Je kunt zelf wel bedenken wat voor voordelen dit biedt?

Dit wetende, kun je vast ook uitpluizen wat jouw stukje code doet in zijn context.

Veranderd door Burgie, 29 augustus 2008 - 22:03


#3

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 30 augustus 2008 - 10:42

Bedankt voor je uitleg alleen begrip ik nog niet wat een define naam constructie voor zin heeft?

#4

Burgie

    Burgie


  • >250 berichten
  • 582 berichten
  • Ervaren gebruiker

Geplaatst op 30 augustus 2008 - 16:26

Bedankt voor je uitleg alleen begrip ik nog niet wat een define naam constructie voor zin heeft?


Wat het in jouw stukje code doet weet ik niet omdat ik de ganse code niet voor mij heb. Met het voorbeeld wat ik gaf dan maar...

Als jouw project uit een ganse reeks source files (.c of .cpp) bestaat is de kans zeer groot dat bepaalde header-files (.h) in verschillende van deze source files worden ge´ncludeerd. Om dubbel werk te vermijden (wat altijd onnodig is, hoe ben je zelf...), moet er een manier zijn om na te gaan of een welbepaalde header-file reeds in het project is ge´ncludeerd. Dit gebeurt dus door na te gaan of een desbetreffende identifier reeds elders in jouw project gedefinieerd is.

In mijn voorbeeld wordt dit gecontroleerd met de identifier "_WINUSER_H". Als de header file "winuser.h" ergens wordt ge´ncludeerd, wordt volgend stukje code uitgevoerd:
#define _WINUSER_H

De identifier "_WINUSER_H" is dan gedifinieerd; de compiler kent deze identifier nu.
Als in een andere source file in dit project, nogmaals de header-file "winuser.h" wordt ge´ncludeerd, dan merkt de compiler dat "_WINUSER_H" reeds is gedefinieerd, en voert hij dus het stukje code
#ifndef _WINUSER_H
#define _WINUSER_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif
niet meer uit. De regels tussen "#ifndef" en "#endif" voert hij dus slechts uit als de desbetreffende identifier nog niet gedefinieerd is (#ifndef = if not defined...).

Hopelijk is het nu wat duidelijker? Dit is natuurlijk zeer "vrij" uitgelegd. Op internet is er vast een gedetailleerdere uitleg terug te vinden :D.

Veranderd door Burgie, 30 augustus 2008 - 16:29


#5

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 30 augustus 2008 - 18:52

Bedankt voor je uitleg ik snap het.

#6

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 30 augustus 2008 - 20:53

Het stukje voorbeeldcode dat jij toont is idd vreemd omdat de define dus altijd zal gebeuren voor de check (#ifndef). Voor de rest is de uitleg van burgie de correcte uitleg over de werking van zulke constructies.

#7

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 11:02

Het stukje voorbeeldcode dat jij toont is idd vreemd omdat de define dus altijd zal gebeuren voor de check (#ifndef).


Dus in het voorbeeldje dat ik gaf zal nooit de code tussen #ifndef en #endif nooit worden uitgevoerd?

#8

Burgie

    Burgie


  • >250 berichten
  • 582 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 11:45

Dus in het voorbeeldje dat ik gaf zal nooit de code tussen #ifndef en #endif nooit worden uitgevoerd?


Als deze lijnen elkaar direct opvolgen in de volgorde die jij opschreef, neen. De identifier "JSMITH" wordt eerst gedefinieerd, en vervolgens wordt er gezegd "if JSMITH is not defined do...".

Vandaar dat ik het concept niet kon uitleggen met jouw voorbeeld...

#9

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 14:19

Als deze lijnen elkaar direct opvolgen in de volgorde die jij opschreef, neen. De identifier "JSMITH" wordt eerst gedefinieerd, en vervolgens wordt er gezegd "if JSMITH is not defined do...".


if JSMITH is not defined do..


Dat betekent toch dat de code niet word uitgevoerd?

#10

Burgie

    Burgie


  • >250 berichten
  • 582 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 14:58

Dat betekent toch dat de code niet word uitgevoerd?


Wat ik net probeerde duidelijk te maken is dat de code NIET wordt uitgevoerd OMDAT in jouw stukje code JSMITH wordt gedefinieerd VOORDAT de voorwaarde "#ifndef..." wordt doorlopen.
Met andere woorden, zoals dat stukje code daar staat, kun je het net zo goed verwijderen want dat stukje zal NOOIT iets nuttig doen.

#11

Bert F

    Bert F


  • >1k berichten
  • 2588 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 17:01

Bedankt dat bedoelde ik. Groeten.

#12

Burgie

    Burgie


  • >250 berichten
  • 582 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2008 - 17:05

Geen probleem. Blij dat het duidelijk is!





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures