Hva er forskjellen om struct i C99 til ANSI-C?

stemmer
1

Denne koden ser ikke ut til å være riktig i ANSI-C, men ok i C99:

struct a { int x; int y; } z;

Hva er forskjellene om struct i C99 og ANSI-C?

Edit: Jeg glemte a, min dårlige. Denne koden kompilerer ok med gcc i C99-modus, men er en syntaksfeil på skinne, som er kjent for å ikke støtte alle C99 utvidelser.

Edit2: Her er resultatet av splint:

Splint 3.1.2 --- 19 Dec 2007

build/ecos_install/include/cyg/fileio/fileio.h:151:5:
Parse Error. Attempting to continue.
build/ecos_install/include/cyg/fileio/fileio.h:151:25:
Cannot recover from parse error.
*** Cannot continue.

Edit3: Denne filen er den eCos fileio.h (den siste linjen i dette fragment er linje 152):

typedef CYG_ADDRWORD cyg_dir;

//=============================================================================
// Filesystem table entry

typedef int     cyg_fsop_mount    ( cyg_fstab_entry *fste, cyg_mtab_entry *mte );
typedef int     cyg_fsop_umount   ( cyg_mtab_entry *mte );
typedef int     cyg_fsop_open     ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    int mode,  cyg_file *fte );
typedef int     cyg_fsop_unlink   ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int     cyg_fsop_mkdir    ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int     cyg_fsop_rmdir    ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int     cyg_fsop_rename   ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1,
                                    cyg_dir dir2, const char *name2 );
typedef int     cyg_fsop_link     ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1,
                                    cyg_dir dir2, const char *name2, int type );
typedef int     cyg_fsop_opendir  ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    cyg_file *fte );
typedef int     cyg_fsop_chdir    ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    cyg_dir *dir_out );
typedef int     cyg_fsop_stat     ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    struct stat *buf);
typedef int     cyg_fsop_getinfo  ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    int key, void *buf, int len );
typedef int     cyg_fsop_setinfo  ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                                    int key, void *buf, int len );


struct cyg_fstab_entry
{
    const char          *name;          // filesystem name
    CYG_ADDRWORD        data;           // private data value
    cyg_uint32          syncmode;       // synchronization mode

    cyg_fsop_mount      *mount;
    cyg_fsop_umount     *umount;
    cyg_fsop_open       *open;
    cyg_fsop_unlink     *unlink;
    cyg_fsop_mkdir      *mkdir;
    cyg_fsop_rmdir      *rmdir;
    cyg_fsop_rename     *rename;
    cyg_fsop_link       *link;
    cyg_fsop_opendir    *opendir;
    cyg_fsop_chdir      *chdir;
    cyg_fsop_stat       *stat;
    cyg_fsop_getinfo    *getinfo;
    cyg_fsop_setinfo    *setinfo;
} CYG_HAL_TABLE_TYPE;
Publisert på 27/01/2009 klokken 10:24
kilden bruker
På andre språk...                            


4 svar

stemmer
4
struct { int x; int y; } z;

Denne koden er gyldig C, med de samme semantikk, fra alle versjoner av C siden 1978 og utover, og sannsynligvis mye tidligere. Den definerer en variabel, kalt z, som har som sitt slag et navn-mindre struct type, som består av to ints.

ofaurax, hva feilmelding får du til å konkludere med at det ikke fungerer?

(Pedantic nit: "ANSI C" betyr den versjonen av C standardisert av ANSI, American National Standards Institute 1989-versjonen av ANSI C standarden ble vedtatt av ISO, den internasjonale standardiseringsorganisasjonen I 1999 laget ISO en ny versjon av.. C-standarden, som ANSI deretter vedtatt tilbake.)

Redigere:

struct a { int x; int y; } z;

Dette definerer et struct type, kalt "struct a", som består av to ints, og en variabel, z, av den typen. Dette er fortsatt velformet selv i 1978-versjonen av C ( "K & R"). Jeg vet ikke hva split er, men de nøyaktige feilmeldinger vil fortsatt trolig hjelpe oss å finne ut hva problemet er.

Svarte 27/01/2009 kl. 10:48
kilden bruker

stemmer
1

En fil med akkurat den koden i det analyseres greit med Splint 3.1.2 .

Kan du gi en enkel, komplett eksempel som viser atferden du beskriver?

En rask bit av eksperimentering sier splint ser ikke ut til å støtte blandet kode og erklæringer, som ville sette meg av å bruke det. Så koden du postet av seg selv er ok, men dette vil gi en syntaksfeil:

void foo () {
   int x = 1;
   ++x;
   struct a { int x; int y; } z;
}

Denne endringen i grammatikk vil tillate det å analysere enkel blandet kode og erklæring ovenfor, og det så synes å fungere, men jeg har ikke testet den uttømmende.

$ diff original/src/cgrammar.y src/cgrammar.y
1711a1712
>  | initializer
Svarte 27/01/2009 kl. 11:44
kilden bruker

stemmer
1

Kan du vise selve kompilatoren advarsler, kompilatoren flagg og de tilhørende kodelinjer din? Det er absolutt ingenting galt med ditt eksempel. Eller kanskje en kobling til dokumentet som førte deg til dine konklusjoner?

Hvis klarerer en kompilator for å fortelle deg forskjellen, hva kompilatoren / versjon bruker du?

Svarte 27/01/2009 kl. 11:03
kilden bruker

stemmer
1

Ikke så sikker, men i "gamle" kompilatorer Jeg husker jeg måtte skrive det som

typedef struct _Z {int x; int y;} z; or just typedef struct {int x; int y;} z;
Svarte 27/01/2009 kl. 10:36
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more