Toon posts:

[C] 'private' functie declareren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil sommige (hulp)functies zodanig gebruiken dat ze alleen binnen in de source file zichbaar zijn en gebruikt kunnen worden, oftewel; ze komen niet in de header file (interface) voor.
Als ik ze gewoon declareer (dus void mijn_functie() {} ), dan krijg ik een warning dat er een type mismatch is, omdat de compiler de files wel in de source ziet staan, maar nergens in de header.
Hoe kan ik dit oplossen?

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 06:41

BoAC

Memento mori

Een type mismatch :? Zoals in je TS staat zie ik geen variablen.. Kun je de code op de regel waarop de foutmelding wordt gegeven posten?

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 01-04 11:43

koli-man

Bartender!!!!

Kun je niet de functie declareren bovenin de c file en daarna de implementaties van de functie ergens anders in de c file zetten?

[ Voor 13% gewijzigd door koli-man op 27-09-2005 13:50 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Verwijderd schreef op dinsdag 27 september 2005 @ 13:42:
Ik wil sommige (hulp)functies zodanig gebruiken dat ze alleen binnen in de source file zichbaar zijn en gebruikt kunnen worden, oftewel; ze komen niet in de header file (interface) voor.
Als ik ze gewoon declareer (dus void mijn_functie() {} ), dan krijg ik een warning dat er een type mismatch is, omdat de compiler de files wel in de source ziet staan, maar nergens in de header.
Hoe kan ik dit oplossen?
Met een static functie :

code:
1
2
3
4
5
6
static void blaat(void);

static void blaat(void)
{
    ......
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 27 september 2005 @ 13:42:
Als ik ze gewoon declareer (dus void mijn_functie() {} ), dan krijg ik een warning dat er een type mismatch is,
Hmm vaag, post je exacte code eens? Heb je de naam "mijn_functie" eerder gedeclareerd met een ander type?
omdat de compiler de files wel in de source ziet staan, maar nergens in de header.
Deze conclusie klopt niet, tenzij je een hele vage compiler gebruikt. Headers zijn niets anders dan files die in-place worden ingelezen op het moment dat je ze #include. De inhoud van een header copypasten in een sourcefile op de plek van de #include geeft exact hetzelfde resultaat. Daarnaast hoef je functies niet te declareren voor je ze definieert.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
koli-man schreef op dinsdag 27 september 2005 @ 13:49:
Kun je niet de functie declareren bovenin de c file en daarna de implementaties van de functie ergens anders in de c file zetten?
Had hier helemaal niet aan gedacht. Dit werkt.


bedankt voor de reacties

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 06:41

BoAC

Memento mori

code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char *argv[])
{
        bla();
        return 0;
}

void bla()
{
        printf("test\n");
}

Door de warning-level hoger te zetten zou de TS gezien hebben dat op regel 5 een
code:
1
warning: implicit declaration of function `bla'

gehad hebben volgens mijn ;)

* BoAC compiled dit met gcc:
code:
1
2
3
4
5
6
test.c: In function `main':
test.c:5: warning: implicit declaration of function `bla'
test.c: At top level:
test.c:10: warning: type mismatch with previous implicit declaration
test.c:5: warning: previous implicit declaration of `bla'
test.c:10: warning: `bla' was previously implicitly declared to return `int'

en zoals koli-man al zei is dat op te lossen door bla() voor main te declareren :)
.oisyn schreef op dinsdag 27 september 2005 @ 13:55:
...
Daarnaast hoef je functies niet te declareren voor je ze definieert.
Wel als je ze eerder gebruikt alhoewel je er in C dan geen error maar een warning krijgt.
* BoAC had alleen de implicit declaration verwacht 8)7

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 01-04 11:43

koli-man

Bartender!!!!

Verwijderd schreef op dinsdag 27 september 2005 @ 13:58:
[...]


Had hier helemaal niet aan gedacht. Dit werkt.


bedankt voor de reacties
Kijk ook naar de reactie van Igmar!

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

BoAC schreef op dinsdag 27 september 2005 @ 14:00:
Wel als je ze eerder gebruikt alhoewel je er in C dan geen error maar een warning krijgt.
* BoAC had alleen de implicit declaration verwacht 8)7
Lees nog eens goed wat ik zeg ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 06:41

BoAC

Memento mori

.oisyn schreef op dinsdag 27 september 2005 @ 14:05:
[...]
Lees nog eens goed wat ik zeg ;)
Kun je een voorbeeld geven? * BoAC begrijpt je dan verkeerd ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

C:
1
2
3
4
5
6
void functie();  // dit is een declaratie

void functie()   // dit is een definitie
{
    printf("Hoi!\n");
}

Een functie hoeft niet gedeclareert te zijn voor je 'm definieert. Hij moet uiteraard wel gedeclareerd of gedefinieerd zijn voor je 'm gebruikt, zoals jij met je voorbeeld aantoont ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Eh, .oisyn, ik wil niet vervelend zijn, maar aangezien de functie al gedeclareerd is bij de { en pas gedefinieerd bij de } declareer je'm dus altijd eerder ;)

(Elke definitie is ook een declaratie)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat is flauw :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Mierensex. :P

Overigens vind ik het persoonlijk wel netter om bovenaan de C-file alle "private" functies wel even te declareren. Dat bespaart in elk geval dit soort problemen, en in combinatie met de H-file kun je veel makkelijker opzoeken welke functies er zijn en hoe ze aangeroepen moeten worden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

MSalters schreef op dinsdag 27 september 2005 @ 22:44:
Eh, .oisyn, ik wil niet vervelend zijn, maar aangezien de functie al gedeclareerd is bij de { en pas gedefinieerd bij de } declareer je'm dus altijd eerder ;)

(Elke definitie is ook een declaratie)
Zolang er geen ; komt, is het onafgesloten, niet interpreteerbaar en dus geen declaratie, want dat impliceert geldige code. :+

Wie trösten wir uns, die Mörder aller Mörder?


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

.oisyn schreef op dinsdag 27 september 2005 @ 14:29:
Een functie hoeft niet gedeclareert te zijn voor je 'm definieert. Hij moet uiteraard wel gedeclareerd of gedefinieerd zijn voor je 'm gebruikt, zoals jij met je voorbeeld aantoont ;)
Het vervelende met als je dat niet doet is dat de compiler een aantal aannames doet over het prototype van de functie, en dat klopt zelden met de praktijk, wat wel eens kan resulteren in vreemde bugs.

Ik vraag me zowiezo af waarom iedereen globals blijft gebruiken, terwijl static functions eigenlijk alleen maar voordelen biedt.

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 06:41

BoAC

Memento mori

Wat zijn dan de nadelen van non-static functions in C? In C++ kan ik mij dat voorstellen ;)

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

BoAC schreef op woensdag 28 september 2005 @ 09:05:
Wat zijn dan de nadelen van non-static functions in C? In C++ kan ik mij dat voorstellen ;)
- Veel meer risico op een name-clash
- Veel meer runtime relocations, vooral bij .so's
- Al die globale functies zijn gewoon lelijk :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

BoAC schreef op woensdag 28 september 2005 @ 09:05:
Wat zijn dan de nadelen van non-static functions in C? In C++ kan ik mij dat voorstellen ;)
In C++ bereik je iha hetzelfde door de functies in een anonymous namespace te declareren/defineren. Je wilt gewoon nooit losse (private) functies met external linkage hebben. External linkage betekent dat het item zichtbaar is buiten de module die je compileert "module public". Internal linkage daarentegen is niet zichtbaar, en dus "module private". Een statische class member in C++ heeft wel external linkage, maar een namespace scope statisch item heeft internal linkage. Ook alle items (statisch of niet) hebben internal linkage in een anonymous namespace. De exacte regels zijn iets uitgebreider (local classes, enums, etc) maar dat is het basis idee.

Het nadeel van een namespace scope non-static functie is dus dat het niet geencapsuleerd is. Als je het bij een class levert is het hetzelfde als een public member die dat niet moet zijn. (want alles dat bij een class module wordt geleverd behoort ook tot die class)

In C++ is het juist niet zo'n groot probleem vanwege namespaces en classes; daar zal je niet zo snel een name clash hebben. In C is het juist een groot probleem. Hoeveel functies max() en min() zijn er wel niet... Als iedereen die met external linkage defineert dan compiled er nooit iets. Vandaar dat je opmerking over het begrijpen van de nadelen in C++ maar niet in C niet helemaal klopt... juist in C is er een groot nadeel, in C++ kan je dit afvangen door goed gebruik van namespaces (of eventueel anonymous namespaces om het hele 'probleem' te omzeilen, zoals gebruikelijk)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
igmar schreef op woensdag 28 september 2005 @ 08:12:
Het vervelende met als je dat niet doet is dat de compiler een aantal aannames doet over het prototype van de functie, en dat klopt zelden met de praktijk, wat wel eens kan resulteren in vreemde bugs.
Dat is niet waar. Jij hebt het over de impliciete declaratie (een functie gebruiken zonder declaratie) terwijl .oisyn het heeft over het definieeren zonder declaratie.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
-NMe- schreef op dinsdag 27 september 2005 @ 22:58:
Mierensex. :P

Overigens vind ik het persoonlijk wel netter om bovenaan de C-file alle "private" functies wel even te declareren. Dat bespaart in elk geval dit soort problemen, en in combinatie met de H-file kun je veel makkelijker opzoeken welke functies er zijn en hoe ze aangeroepen moeten worden. :)
De functie zelf boven alle aanroepen ervan zetten is toch ook voldoende om dit 'probleem' op te lossen?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Idd, ik zou private functies ook niet in een header stoppen, ze zijn immers private en niet bedoeld voor anderen om te gebruiken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

OlafvdSpek schreef op woensdag 28 september 2005 @ 10:58:
Dat is niet waar. Jij hebt het over de impliciete declaratie (een functie gebruiken zonder declaratie) terwijl .oisyn het heeft over het definieeren zonder declaratie.
Als je een functie gebruikt terwijl de definitie pas later staat is er altijd sprake van een implicit declaration en doet de compiler aannames. Of praten wij nu langs elkaar heen ? :)

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

OlafvdSpek schreef op woensdag 28 september 2005 @ 11:01:
[...]

De functie zelf boven alle aanroepen ervan zetten is toch ook voldoende om dit 'probleem' op te lossen?
En hoe denk je

C:
1
2
3
4
5
6
7
8
9
void func1(void)
{
     func2();
}

void func2(void)
{
   func1();
}


op die manier op te lossen ? Het voorbeeld slaat nergens op, maar het gaat even om het idee. Een declaratie bovenaan lost dit soort problemen op, en de code is ook een stuk makkelijker te lezen op die manier.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar: [rml].oisyn in "[ C] 'private' functie declareren"[/rml]. Let even op de werkwoorden definieren en gebruiken ;)

[ Voor 24% gewijzigd door .oisyn op 28-09-2005 11:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
igmar schreef op woensdag 28 september 2005 @ 11:22:
En hoe denk je ... op die manier op te lossen ? Het voorbeeld slaat nergens op, maar het gaat even om het idee. Een declaratie bovenaan lost dit soort problemen op, en de code is ook een stuk makkelijker te lezen op die manier.
Ik zei niet dat het altijd op die manier op te lossen is, soms zijn declaraties echt nodig. Maar meestal niet.

Verder vraag ik me ook nu weer af waarom er C gebruikt wordt en niet C++. Dan heb je het hele probleem met implicit declarations niet.

[ Voor 14% gewijzigd door Olaf van der Spek op 28-09-2005 12:26 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

OlafvdSpek schreef op woensdag 28 september 2005 @ 11:01:
De functie zelf boven alle aanroepen ervan zetten is toch ook voldoende om dit 'probleem' op te lossen?
Leuk puzzelwerk als je een keer bij nader indien een functie wil gaan aanroepen in een andere functie die daar al boven staat. Wanneer je even vantevoren alles declareert is het voor jezelf makkelijker na te zoeken hoe een functie werkt, en bovendien bespaar je jezelf dus puzzelwerk. Natuurlijk is het ook voldoende om goed op de volgorde van je functies te letten, maar in de praktijk vind ik het niet fijn werken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
-NMe- schreef op woensdag 28 september 2005 @ 16:02:
Leuk puzzelwerk als je een keer bij nader indien een functie wil gaan aanroepen in een andere functie die daar al boven staat. Wanneer je even vantevoren alles declareert is het voor jezelf makkelijker na te zoeken hoe een functie werkt, en bovendien bespaar je jezelf dus puzzelwerk. Natuurlijk is het ook voldoende om goed op de volgorde van je functies te letten, maar in de praktijk vind ik het niet fijn werken.
Als je niet van puzzelen houdt kun je in dat geval natuurlijk altijd de declaratie even aanmaken.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

OlafvdSpek:
Als je niet van puzzelen houdt kun je in dat geval natuurlijk altijd de declaratie even aanmaken.
Ik zie niet in waarom je het jezelf lastiger zou maken dan nodig. Als je gewoon de declaraties altijd bovenaan zet heb je er nooit last van, en 't is een kleine moeite.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1