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

OP #7401771

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
  5. 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

Moderator Persönliche Seite

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.