1 van 1

Define in c.

Geplaatst: vr 29 aug 2008, 19:46
door Bert F
Soms heb je in c code het volgende:

Code: Selecteer alles

#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.

Re: Define in c.

Geplaatst: vr 29 aug 2008, 23:00
door Burgie
Je kan inderdaad de boodschap geven aan de zogenaamde preprocessor om een identifier in de source code te vervangen door een volgende constructie:

Code: Selecteer alles

#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...

Code: Selecteer alles

#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:

Code: Selecteer alles

#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.

Re: Define in c.

Geplaatst: za 30 aug 2008, 11:42
door Bert F
Bedankt voor je uitleg alleen begrip ik nog niet wat een define naam constructie voor zin heeft?

Re: Define in c.

Geplaatst: za 30 aug 2008, 17:26
door Burgie
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:

Code: Selecteer alles

#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

Code: Selecteer alles

#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 .

Re: Define in c.

Geplaatst: za 30 aug 2008, 19:52
door Bert F
Bedankt voor je uitleg ik snap het.

Re: Define in c.

Geplaatst: za 30 aug 2008, 21:53
door Cycloon
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.

Re: Define in c.

Geplaatst: zo 31 aug 2008, 12:02
door Bert F
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?

Re: Define in c.

Geplaatst: zo 31 aug 2008, 12:45
door Burgie
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...

Re: Define in c.

Geplaatst: zo 31 aug 2008, 15:19
door Bert F
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?

Re: Define in c.

Geplaatst: zo 31 aug 2008, 15:58
door Burgie
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.

Re: Define in c.

Geplaatst: zo 31 aug 2008, 18:01
door Bert F
Bedankt dat bedoelde ik. Groeten.

Re: Define in c.

Geplaatst: zo 31 aug 2008, 18:05
door Burgie
Geen probleem. Blij dat het duidelijk is!