[C] Met headerfiles dingen dubbel definiëren

Pagina: 1
Acties:

  • SvMp
  • Registratie: September 2000
  • Niet online
Dingen meer dan één keer definiëren mag niet. Ik heb het over de programmeertaal C.
Hierover heb ik een vraag. Vast een newbie vraag, maar met de search kwam ik niet ver.

Als ik een header file 2 keer gebruik dan krijg ik een melding over dubbele definities. Helaas kan ik dat niet altijd vermijden.

Voorbeeld:
Stel ik heb een functie1.h en een functie2.h, die definities bevatten voor functie1.c en functie2.c
Ik heb een library.c en library.h.
Ten slotte een defs.h

In defs wordt een structure type definieerd die alle functies nodig hebben.
Dus in functie1.h en functie2.h voeg ik deze in (de structure wordt als parameter meegegeven in alle functies).

library.h is de globale headerfile voor de gehele library, net zoals bijvoorbeeld mysql.h de globale headerfile is voor de gehele libmysql.

In library.h include ik uiteraard functie1.h en functie2.h, zodat deze functies bij het includen van library.h bekend worden.
Maar dat gaat fout: de structure is dubbel definieerd, nl. zowel in functie1.h als functie2.h.

Hoe los ik dat op?
Met preprocessor commando's werken? :?

(vast een domme vraag, maar ik kan het antwoord niet vinden in mijn boeken, aangezien daar geen uitgebreide library's behandeld worden die uit meerdere broncode bestanden bestaann)

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Ik heb je vraag niet helemaal gelezen (tja vrijdagavond he :+) maar ik denk dat je zoiets zoekt:
code:
1
2
3
4
#ifndef __FUNCTIE1_H // oid
  #define __FUNCTIE1_H 
  typdef struct myStruct .... // whatever
#endif

  • SvMp
  • Registratie: September 2000
  • Niet online
Op zaterdag 09 februari 2002 22:26 schreef stylee het volgende:
Ik heb je vraag niet helemaal gelezen (tja vrijdagavond he :+) maar ik denk dat je zoiets zoekt:
code:
1
2
3
4
#ifndef __FUNCTIE1_H // oid
  #define __FUNCTIE1_H 
  typdef struct myStruct .... // whatever
#endif
Aan zo'n constructie heb ik ook zitten denken, maar vreemd genoeg vond ik zo iets niet terug in de headerfiles van libmysql (die ik ff als voorbeeld gebruik).

Is dit de gangbare manier om zo iets aan te pakken?
Zo ja dan zal ik het gewoon op die manier doen.

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Jup dat is idd de meest gangbare manier om zoiets aan te pakken.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
wat een andere oplossing is, is om de struct in een .c file te declareren, en dan extern in de header zetten... kweet niet of dit met C werkt... (nooit C gedaan)

overigens is de ifndef/define/endif structuur inderdaad het meest gangbare.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

_Mo_: wat een andere oplossing is, is om de struct in een .c file te declareren, en dan extern in de header zetten... kweet niet of dit met C werkt... (nooit C gedaan)

Ju dat werkt, maar die methode wordt meer toegepast om bijv een pointer naar die struct te kunnen krijgen zodat je toegang hebt tot dezelfde struct in verschillende .c files.

  • SvMp
  • Registratie: September 2000
  • Niet online
Op zondag 10 februari 2002 10:41 schreef stylee het volgende:
_Mo_: wat een andere oplossing is, is om de struct in een .c file te declareren, en dan extern in de header zetten... kweet niet of dit met C werkt... (nooit C gedaan)

Ju dat werkt, maar die methode wordt meer toegepast om bijv een pointer naar die struct te kunnen krijgen zodat je toegang hebt tot dezelfde struct in verschillende .c files.
Ja, maar dan bedoel je een werkelijk bestaande struct. Niet slecht een typering ervan, waar ik het in mijn voorgaande posts steeds over heb.

  • igmar
  • Registratie: April 2000
  • Laatst online: 09-09 19:53

igmar

ISO20022

Hoe los ik dat op?
Met preprocessor commando's werken? :?

(vast een domme vraag, maar ik kan het antwoord niet vinden in mijn boeken, aangezien daar geen uitgebreide library's behandeld worden die uit meerdere broncode bestanden bestaann)
#ifndef __HEADERFILE_1_H__
#define __HEADERFILE_1_H__

/* Zooitje defines, structs, prototype ed */

#endif

Die #if is dus om de gehele .h file heen !! En vanzelfsprekend andere namen gebruiken voor de define :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Ter illustratie over hoe met preprocessor commando's te werken hier een header die compleet eruit bestaat (windows.h :) ) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/*++ BUILD Version: 0001    Increment this if a change has global effects

Copyright (c) Microsoft Corporation. All rights reserved.

Module Name:


    windows.h

Abstract:

    Master include file for Windows applications.

--*/

#ifndef _WINDOWS_
#define _WINDOWS_


#ifndef WINVER
#define WINVER 0x0501
#else
#if defined(_WIN32_WINNT) && (WINVER < 0x0400) && (_WIN32_WINNT > 0x0400)
#error WINVER setting conflicts with _WIN32_WINNT setting
#endif
#endif

#ifndef _INC_WINDOWS
#define _INC_WINDOWS

#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

/*  If defined, the following flags inhibit definition
 *     of the indicated items.
 *
 *  NOGDICAPMASKS     - CC_*, LC_*, PC_*, CP_*, TC_*, RC_
 *  NOVIRTUALKEYCODES - VK_*
 *  NOWINMESSAGES     - WM_*, EM_*, LB_*, CB_*
 *  NOWINSTYLES  - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_*
 *  NOSYSMETRICS    - SM_*
 *  NOMENUS      - MF_*
 *  NOICONS      - IDI_*
 *  NOKEYSTATES  - MK_*
 *  NOSYSCOMMANDS     - SC_*
 *  NORASTEROPS  - Binary and Tertiary raster ops
 *  NOSHOWWINDOW    - SW_*
 *  OEMRESOURCE  - OEM Resource values
 *  NOATOM      - Atom Manager routines
 *  NOCLIPBOARD  - Clipboard routines
 *  NOCOLOR      - Screen colors
 *  NOCTLMGR        - Control and Dialog routines
 *  NODRAWTEXT    - DrawText() and DT_*
 *  NOGDI        - All GDI defines and routines
 *  NOKERNEL        - All KERNEL defines and routines
 *  NOUSER      - All USER defines and routines
 *  NONLS        - All NLS defines and routines
 *  NOMB          - MB_* and MessageBox()
 *  NOMEMMGR        - GMEM_*, LMEM_*, GHND, LHND, associated routines
 *  NOMETAFILE    - typedef METAFILEPICT
 *  NOMINMAX        - Macros min(a,b) and max(a,b)
 *  NOMSG        - typedef MSG and associated routines
 *  NOOPENFILE    - OpenFile(), OemToAnsi, AnsiToOem, and OF_*
 *  NOSCROLL        - SB_* and scrolling routines
 *  NOSERVICE      - All Service Controller routines, SERVICE_ equates, etc.
 *  NOSOUND      - Sound driver routines
 *  NOTEXTMETRIC    - typedef TEXTMETRIC and associated routines
 *  NOWH          - SetWindowsHook and WH_*
 *  NOWINOFFSETS    - GWL_*, GCL_*, associated routines
 *  NOCOMM      - COMM driver routines
 *  NOKANJI      - Kanji support stuff.
 *  NOHELP      - Help engine interface.
 *  NOPROFILER    - Profiler interface.
 *  NODEFERWINDOWPOS  - DeferWindowPos routines
 *  NOMCX        - Modem Configuration Extensions
 */

#if defined(RC_INVOKED) && !defined(NOWINRES)

#include <winresrc.h>

#else

#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
#define NOGDICAPMASKS
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NOOPENFILE
#define NORASTEROPS
#define NOSCROLL
#define NOSOUND
#define NOSYSMETRICS
#define NOTEXTMETRIC
#define NOWH
#define NOCOMM
#define NOKANJI
#define NOCRYPT
#define NOMCX
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86)
#define _X86_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64)
#define _AMD64_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_M68K)
#define _68K_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_MPPC)
#define _MPPC_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_M_IX86) && !defined(_AMD64_) && defined(_M_IA64)
#if !defined(_IA64_)
#define _IA64_
#endif // !_IA64_
#endif

#ifndef _MAC
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif

#if defined (_MSC_VER)
#if ( _MSC_VER >= 800 )
#ifndef __cplusplus
#pragma warning(disable:4116)    // TYPE_ALIGNMENT generates this - move it
                        // outside the warning push/pop scope.
#endif
#endif
#endif

#ifndef RC_INVOKED
#if     ( _MSC_VER >= 800 )
#pragma warning(disable:4514)
#ifndef __WINDOWS_DONT_DISABLE_PRAGMA_PACK_WARNING__
#pragma warning(disable:4103)
#endif
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#endif
#include <excpt.h>
#include <stdarg.h>
#endif /* RC_INVOKED */

#include <windef.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
#if !defined(_MAC) || defined(_WIN32NLS)
#include <winnls.h>
#endif
#ifndef _MAC
#include <wincon.h>
#include <winver.h>
#endif
#if !defined(_MAC) || defined(_WIN32REG)
#include <winreg.h>
#endif
#ifndef _MAC
#include <winnetwk.h>
#endif

#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
#include <dlgs.h>
#ifndef _MAC
#include <lzexpand.h>
#include <mmsystem.h>
#include <nb30.h>
#include <rpc.h>
#endif
#include <shellapi.h>
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif
#ifndef NOCRYPT
#include <wincrypt.h>
#include <winefs.h>
#include <winscard.h>
#endif

#ifndef NOGDI
#ifndef _MAC
#include <winspool.h>
#ifdef INC_OLE1
#include <ole.h>
#else
#include <ole2.h>
#endif /* !INC_OLE1 */
#endif /* !MAC */
#include <commdlg.h>
#endif /* !NOGDI */
#endif /* WIN32_LEAN_AND_MEAN */

#include <stralign.h>

#ifdef _MAC
#include <winwlm.h>
#endif


#ifdef INC_OLE2
#include <ole2.h>
#endif /* INC_OLE2 */

#ifndef _MAC
#ifndef NOSERVICE
#include <winsvc.h>
#endif

#if(WINVER >= 0x0400)
#ifndef NOMCX
#include <mcx.h>
#endif /* NOMCX */

#ifndef NOIME
#include <imm.h>
#endif
#endif /* WINVER >= 0x0400 */
#endif

#ifndef RC_INVOKED
#if     ( _MSC_VER >= 800 )
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning(default:4001)
#pragma warning(default:4201)
#pragma warning(default:4214)
/* Leave 4514 disabled.  It's an unneeded warning anyway. */
#endif
#endif
#endif /* RC_INVOKED */

#endif /* RC_INVOKED */

#endif /* _INC_WINDOWS */
#endif /* _WINDOWS_ */

Professionele website nodig?


Verwijderd

Je moet de header files alleen in de source files include. als je toch bepaalde structs of functies (of in c++ classes) in je header file wilt gebruiken moet je alleen de funcie of struct declareren.

vb.
de struct eenStruct heb je in defs.h gedefinieerd

header file (functie1.h) :

struct eenStruct ;
void functie (eenStruct bla) ;

source file (functie1.c) :

#include "functie1.h"
#include "defs.h"

void functie (eenStruct bla {
....
}

Dit werkt in ieder geval prima met c++ en met classes en ik denk ook wel in C met structs.
Pagina: 1