Forum: PC-Programmierung gcc: storage size of "struct addrinfo" mit verschiedenen C-Standards


von Dennis S. (eltio)


Lesenswert?

Hallo zusammen,

ich schaue mir gerade den "Beej's Guide to Network Programming" an. In 
Kapitel 5 wird die Verwendung von `getaddrinfo` gezeigt (siehe [1]). Ich 
bekomme je nach C-Standard den ich beim Kompilieren angebe 
Fehlermeldungen. Meine gcc-Version ist "gcc (Debian 10.2.1-6) 10.2.1 
20210110", also müsste der Default "-std=gnu11" sein.

1. **gcc -Wall -Wextra showip.c**: Keine Fehler oder Warnungen
2. **gcc -Wall -Wextra -std=gnu11 showip.c**: Keine Fehler oder 
Warnungen
3. **gcc -Wall -Wextra -std=c11 showip.c**: showip.c:15:18: error: 
storage size of ‘hints’ isn’t known
4. **gcc -Wall -Wextra -std=c99 showip.c**: showip.c:15:18: error: 
storage size of ‘hints’ isn’t known
6. **gcc -Wall -Wextra -std=c2x showip.c**: showip.c:15:18: error: 
storage size of ‘hints’ isn’t known

Offensichtlich ist die Fehlermeldung nicht dem (alten) Standard zu 
verdanken, sondern einer fehlenden Extension die gcc anbietet.

Frage: welche Erweiterung nutzt der Schalter "-std=gnu11" hier und 
welche Änderungen sind notwendig um ein "Standard-C" (in welcher Version 
auch immer) nutzen zu können?

Gruß Dennis

[1] https://beej.us/guide/bgnet/examples/showip.c

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis S. schrieb:
> Frage: welche Erweiterung nutzt der Schalter "-std=gnu11" hier und
> welche Änderungen sind notwendig um ein "Standard-C" (in welcher Version
> auch immer) nutzen zu können?

Schau doch einfach in <netdb.h> rein.
1
/* Extension from POSIX.1:2001.  */
2
#ifdef __USE_XOPEN2K
3
/* Structure to contain information about address of a service provider.  */
4
struct addrinfo
5
{
6
  int ai_flags;                 /* Input flags.  */
7
  int ai_family;                /* Protocol family for socket.  */
8
  int ai_socktype;              /* Socket type.  */
9
  int ai_protocol;              /* Protocol for socket.  */
10
  socklen_t ai_addrlen;         /* Length of socket address.  */
11
  struct sockaddr *ai_addr;     /* Socket address for socket.  */
12
  char *ai_canonname;           /* Canonical name for service location.  */
13
  struct addrinfo *ai_next;     /* Pointer to next in list.  */
14
};

Du musst ihm also irgendwie verklickern, dass du ein XOPEN2K kompatibles 
Build haben möchtest.

Auch wenn du es mit der Compilerversion indirekt beschrieben hast, wäre 
es natürlich gut, das benutzte OS mit dazu zu nennen. Bei FreeBSD sehe 
ich beispielsweise keine solche Definitionsabhängigkeiten in den 
Headers.

Related:

https://stackoverflow.com/questions/33076175/why-is-struct-addrinfo-defined-only-if-use-xopen2k-is-defined

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.