Avatar billede mollevp Nybegynder
04. august 2005 - 23:27 Der er 9 kommentarer og
1 løsning

#ifndef problem

Hej jeg har en header fil der indeholder en struct og lidt sager som to C filer skal have adgang til.. Jeg har lavet følgende:

/* Struct containing the paramters needed to start the server */
typedef struct{
   
    char filename[255];     /* Filename of the file to play */
    int transcode_status;    /* Whether transcode is off/on (0/1) */
    int no_Description;        /* The number of descriptions */
    char* entry[8];        /* Client names, number depends on the #descriptions */
    int codec;            /* Id of the choosen codec - refering to the codec array */
   
   
} _server_data;

_server_data server_data;

#ifndef EDWIN_H
#define EDWIN_H

char* codec_names[] = {"mp2v", "mp4v"};

#endif

Jeg får alligevel at vide at:

flere definitioner af "codec_names"

hvad gør jeg galt.. ?

Mvh Morten
Avatar billede arne_v Ekspert
04. august 2005 - 23:31 #1
#ifndef EDWIN_H
#define EDWIN_H

...

#endif

skal omkring hele indholdet af .H filen

og gælder kun for en enkelt kompilering (af en enkelt .C fil)
Avatar billede arne_v Ekspert
04. august 2005 - 23:31 #2
prøv med:

extern char* codec_names[] = {"mp2v", "mp4v"};
Avatar billede mollevp Nybegynder
04. august 2005 - 23:43 #3
Har lige prøvet med:

#ifndef EDWIN_H
#define EDWIN_H

/* Struct containing the paramters needed to start the server */
typedef struct{
   
    char filename[255];     /* Filename of the file to play */
    int transcode_status;    /* Whether transcode is off/on (0/1) */
    int no_Description;        /* The number of descriptions */
    char* entry[8];        /* Client names, number depends on the #descriptions */
    int codec;            /* Id of the choosen codec - refering to the codec array */
   
   
} _server_data;

_server_data server_data;

extern char* codec_names[] = {"mp2v", "mp4v"};

#endif

Men det giver stadig fejl, tror det her er det vigtigste fra compiler output:

In file included from callbacks.c:10:
edwin.h:18: advarsel: `codec_names' initialized and declared `extern'

In file included from edwin.c:1:
edwin.h:18: advarsel: `codec_names' initialized and declared `extern'

flere definitioner af "codec_names"
callbacks.o(.data+0x0):/home/molle/demonstrator/gui/src/callbacks.c:14: først defineret hér

Nogle forslag?
Avatar billede arne_v Ekspert
04. august 2005 - 23:45 #4
extern char* codec_names[];

i .H filen og

char* codec_names[] = {"mp2v", "mp4v"};

i en enkelt .C fil
Avatar billede mollevp Nybegynder
04. august 2005 - 23:50 #5
jo, ok - jeg ville bare gerne have haft det et sted.. men det bliver løsningen.. Jeg takker for de hurtige og præcise svar..

Jeg troede ellers at det glads "globalt" at lave en #ifndef, er det sådan at du lige ligger inde med et godt link der beskriver de der pre-processor direktiver? Tror lige de skal genopfriskes :)

Og husk at ligge et svar :)

Mvh Morten
Avatar billede arne_v Ekspert
04. august 2005 - 23:54 #6
slet ikke

pre processoren konverterer en .c fil til en .i fil hvor alle #include, #define,
#ifdef #endif bliver processet

.i filen køres så gennem den rigtige C compiler

derfor er preprocessing helt knyttet til den enkelte .c fil

[der er compilere som ikke bruger filer, men laver det hele i memory, men
princippet er det samme]
Avatar billede arne_v Ekspert
04. august 2005 - 23:54 #7
og svar
Avatar billede arne_v Ekspert
04. august 2005 - 23:56 #8
du bruger gcc ?

prøv:

gcc -E foobar.c -o foobar.i

så opdager du hvad preprocessoren gør !
Avatar billede mollevp Nybegynder
05. august 2005 - 00:05 #9
jeps, jeg bruger gcc.. det vil jeg prøve - takker..
Avatar billede arne_v Ekspert
05. august 2005 - 00:08 #10
og for en god ordens skyld - pointen med #ifndef'en er at man ikke får
den samme .h fil inkluderet 2 gange i en enkelt .c fil - scenarier er:

noget1.h inkluderer base.h

noget2.h inkluderer base.h

noget.c inkluderer både noget1.h og noget2.h
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis