Avatar billede naxosnaxos Nybegynder
30. april 2003 - 19:12 Der er 17 kommentarer og
1 løsning

funktioner i seperat c fil HASTER

Hey

har et C program med en fil main.c ;o)

I denne fil vil jeg bruge nogle funktioner. for at den ikke skal blive MEGET lang vil jeg gerne have disse i en seperat C fil func.c.
Men hvis jeg i func.c har denne

int test()
{
  return 9;
}

og i main.c laver en #include func.c og dernæst bruger min funktion får jeg en fejl.
implicit decleration siger den.....

skal jeg lave en func.h med prototypen int test();
og så inkluder denne header i min main.c. Og udover inkluder func.h i func.c???

FORKLAR....
Avatar billede erikjacobsen Ekspert
30. april 2003 - 19:16 #1
Der er ikke noget at forklare, for umiddelbart skal den ikke
opføre sig sådan. Du skal vise os noget mere kode.
Avatar billede soreno Praktikant
30. april 2003 - 19:17 #2
Ja.

Du skal også huske at kompilere "func.c" og linke med objekt filen

F.eks.
-------func.h
#ifndef FUNC_H
#define FUNC_H

int getInt();

#endif

-------func.c
#include "func.h"

int getInt()
{
    return 12345;
}

-------main.c
#include <stdio.h>
#include "func.h"

int main(void)
{
    printf("%i\n", getInt());

    return 0;
}


ifndef, define og endif bruges til at sikre at der ikke opstår "cirkulær include" - det kan compilere nemlig ikke hitte udaf.
Avatar billede arne_v Ekspert
30. april 2003 - 19:18 #3
Normalt vil du have:

func.h
------

#ifndef FUNC_H
#define FUNC_H

void f();

#endif


main.c
------

#include "func.h"

int main()
{
  f();
}

func.c
------

#include "func.h"

void f()
{
    return;
}
Avatar billede erikjacobsen Ekspert
30. april 2003 - 19:19 #4
Du *skal* ikke lave en func.h/func.c - du *kan*.

Men det forklarer ikke hvorfor include "func.c" ikke virker.
Avatar billede arne_v Ekspert
30. april 2003 - 19:19 #5
Med GCC kan du så bygge med:

gcc -c func.c -o func.obj
gcc -c main.c -o main.obj
gcc main.obj func.obj -o main.exe
Avatar billede arne_v Ekspert
30. april 2003 - 19:22 #6
Den eneste forklaring jeg kan komme på, hvorfor
#include "func.c"
skulle give den fejl er hvis include er neden under
main (eller hvis der er en tyrk-fejl).

Men jeg vil på det kraftigste fraråde at includere
al C kode i en enkelt fil.
Avatar billede erikjacobsen Ekspert
30. april 2003 - 19:26 #7
Nedenunder main virker det nu også. Der er nemlig et eller
andet andet galt ;) Det skal vi have fundet ud af.

Og er det bare et enkelt C-program, så herregud, så er det
er da fint nok. Et større system: så .h/.c opdeling!
Avatar billede arne_v Ekspert
30. april 2003 - 19:35 #8
Erik det er forkert. I C vil erklæring af funktioner
efter brug give en fejl.
Avatar billede arne_v Ekspert
30. april 2003 - 19:36 #9
int main()
{
  f();
}

void f()
{
  return;
}

giver f.eks. i GCC 3.1:

C:\>gcc zz.c
zz.c:7: warning: type mismatch with previous implicit declaration
zz.c:3: warning: previous implicit declaration of `f'
zz.c:7: warning: `f' was previously implicitly declared to return `int'
Avatar billede arne_v Ekspert
30. april 2003 - 19:37 #10
"implcit declaration" matcher rimeligt godt med fejlen
i spørgsmålet.

[strengt taget er det kun en warning og ikke en fejl - C++
giver en rigtig fejl]
Avatar billede arne_v Ekspert
30. april 2003 - 19:39 #11
zz.c: In function `int main()':
zz.c:3: `f' undeclared (first use this function)
zz.c:3: (Each undeclared identifier is reported only once for each function it
  appears in.)
zz.c: In function `void f()':
zz.c:7: `void f()' used prior to declaration
Avatar billede erikjacobsen Ekspert
30. april 2003 - 19:43 #12
Ja, generelt, Arne, men ikke specifikt. Hans funktion er
jo netop en

  int test()

ikke en

  void test()
Avatar billede arne_v Ekspert
30. april 2003 - 19:49 #13
int main()
{
  f();
}

int f()
{
  return 9;
}

giver ingen warnings i GCC, men så skifter jeg bare til Compaq C:

$ cc zz.c

  f();
...^
%CC-I-IMPLICITFUNC, In this statement, the identifier "f" is implicitly declared
as a function.
at line number 3 in file DISK2:[ARNE]ZZ.C;1

og så har vi warning på implicit declaration igen.

[Compaq C er default rimeligt picky]
Avatar billede erikjacobsen Ekspert
30. april 2003 - 20:01 #14
Ja *g* det er bestemt ikke i ægte C-stil
Avatar billede arne_v Ekspert
30. april 2003 - 20:05 #15
Den er ret snu.

Den kan også tælle.

#include <stdio.h>

int main()
{
  printf("%d %d\n",1);
  printf("%d\n",1,2);
}

$ cc zzzz.c

  printf("%d %d\n",1);
..........^
%CC-W-OUTTOOFEW, In this statement, the number of conversion specifiers to print
f exceeds the number of values to be converted.  Conversion specifiers from "%d"
onward will process meaningless and perhaps invalid data.
at line number 5 in file DISK2:[ARNE]ZZZZ.C;2

  printf("%d\n",1,2);
...................^
%CC-I-OUTTOOMANY, In this statement, additional arguments to printf are provided
for which there are no conversion specifiers in the format string.  Arguments f
rom "2" onward will be evaluated, but not processed by printf.
at line number 6 in file DISK2:[ARNE]ZZZZ.C;2
Avatar billede arne_v Ekspert
30. april 2003 - 20:07 #16
Men ihvertfald finder jeg det meget naturligt, hvis include af en
C fil nedenunder der hvor den bliver brugt giver en
"implicit decleration siger den....." som i spørgsmålet.
Avatar billede erikjacobsen Ekspert
30. april 2003 - 20:17 #17
Godt så. Det kan være han ikke lige bruger gcc.
Kan vi få naxosnaxos til at flytte #include linien?
Avatar billede naxosnaxos Nybegynder
30. april 2003 - 22:19 #18
hmm ja jeg kom hurtigt frem til samme. problemet var at jeg lige havde glemt en prototype. SÅ point til den første med noget kontrsuktivt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
53 min siden Excel Makroer programmering bit32 - bit64 Af bhh i Excel
I går 21:13 Samsung tv Af life53@live.dk i Andre styresystemer
I går 21:03 Mount kommando Af Uvanga i Windows
I går 20:40 Eliminer kendte Af andershl i Excel
I går 18:22 Repeater. Af Bit i Mobilnetværk