sizeof nicht anwendbar ?



  • Hi !

    Folgendes Programm bindet den Linux tcp Header /usr/include/netinet/tcp.h ein.

    #include <netinet/tcp.h>
    #include <stdio.h>
    
    int main( int argc , char** argv ) {
    
        printf("%d" , sizeof( struct tcphdr ) );
    
    }
    

    Allerdings erhalte ich folgenden Fehler, wenn ich das Programm mit folgendem Befehl kompiliere:

    gcc -std=c99 -o server server_v2.c
    server_v2.c: In function main:
    server_v2.c:19: error: invalid application of sizeof to incomplete type struct tcphdr
    

    Wenn ich das ganze so kompiliere funktionierts:

    gcc -o server server_v2.c
    

    Wie kommts ?



  • Mit -std=c99 übersetzt der gcc ziemlich strikt nach dem C99 Standard, welcher diese Operation (sizeof auf einen "incomplete type") eben nicht erlaubt. Ohne -std=c99 (bzw. mit -std=gnu99) werden GNU-Erweiterungen erlaubt, wie eben auch das normalerweise verbotene.



  • Eigentlich ist es so, dass der gcc bei -std=c99 die Umgebungsdefines _POSIX_SOURCE, _BSD_SOURCE etc. nicht setzt, wodurch tatsächlich keine struct tcphdr definiert wird. Mit -std=gnu99 werden die gesetzt, und dadurch ist tcphdr auch wieder complete.

    Hier wird nix normalerweise verbotenes erlaubt gemacht, wie denn auch, soll der Compiler die Größe vorhersagen? 😉



  • Krass! Keine schlechten Antworten. Danke!



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Compiler-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply