Define in c.

Moderators: jkien, Xilvo

Reageer
Berichten: 2.589

Define in c.

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.

Berichten: 582

Re: Define in c.

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.

Berichten: 2.589

Re: Define in c.

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

Berichten: 582

Re: Define in c.

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 .

Berichten: 2.589

Re: Define in c.

Bedankt voor je uitleg ik snap het.

Gebruikersavatar
Berichten: 4.810

Re: Define in c.

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.

Berichten: 2.589

Re: Define in c.

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?

Berichten: 582

Re: Define in c.

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

Berichten: 2.589

Re: Define in c.

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?

Berichten: 582

Re: Define in c.

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.

Berichten: 2.589

Re: Define in c.

Bedankt dat bedoelde ik. Groeten.

Berichten: 582

Re: Define in c.

Geen probleem. Blij dat het duidelijk is!

Reageer