当前位置: 首页 > 知识库问答 >
问题:

C语言编译时出现invalid application of 'sizeof' to an incomplete type 'struct tcphdr'怎么办?

柯凯旋
2023-09-05

Hello!
简而言之,所谓"struct tcphdr"是一个来自外部的被include的库文件的结构体.
而且它这个结构体的构造有点诡异.我不知道什么是__extension__ union,这会让它更难处理吗?

struct tcphdr  {    __extension__ union    {      struct      {    uint16_t th_sport;    /* source port */    uint16_t th_dport;    /* destination port */    tcp_seq th_seq;        /* sequence number */    tcp_seq th_ack;        /* acknowledgement number */# if __BYTE_ORDER == __LITTLE_ENDIAN    uint8_t th_x2:4;    /* (unused) */    uint8_t th_off:4;    /* data offset */# endif# if __BYTE_ORDER == __BIG_ENDIAN    uint8_t th_off:4;    /* data offset */    uint8_t th_x2:4;    /* (unused) */# endif    uint8_t th_flags;# define TH_FIN    0x01# define TH_SYN    0x02# define TH_RST    0x04# define TH_PUSH    0x08# define TH_ACK    0x10# define TH_URG    0x20    uint16_t th_win;    /* window */    uint16_t th_sum;    /* checksum */    uint16_t th_urp;    /* urgent pointer */      };      struct      {    uint16_t source;    uint16_t dest;    uint32_t seq;    uint32_t ack_seq;# if __BYTE_ORDER == __LITTLE_ENDIAN    uint16_t res1:4;    uint16_t doff:4;    uint16_t fin:1;    uint16_t syn:1;    uint16_t rst:1;    uint16_t psh:1;    uint16_t ack:1;    uint16_t urg:1;    uint16_t res2:2;# elif __BYTE_ORDER == __BIG_ENDIAN    uint16_t doff:4;    uint16_t res1:4;    uint16_t res2:2;    uint16_t urg:1;    uint16_t ack:1;    uint16_t psh:1;    uint16_t rst:1;    uint16_t syn:1;    uint16_t fin:1;# else#  error "Adjust your <bits/endian.h> defines"# endif    uint16_t window;    uint16_t check;    uint16_t urg_ptr;      };    };};

我不能在程序里对它进行sizeof,或者对指向它的类型的地址进行->操作,无法编译通过.
问题是这是官方给的源码,它肯定自己编译是通过的啊?是我的编译选项有问题吗?我是本地交叉编译.
而且,sizeof实在不行的话我可以直接把它全改成具体的数字,但->这个操作我不可能把它混过去.
怎么办好呢?

共有1个答案

秦皓君
2023-09-05

莫名其妙把-std=c11变成-std=gnu11就过了,,

 类似资料:
  • 主要内容:#if 的用法,#ifdef 的用法,#ifndef 的用法,三者之间的区别假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢? 这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出不同的平台。 Windows 有专有的宏 ,Linux 有专有的宏 ,以现有的知识,我们很容易就想到了 if else,请看下面的代码: 但这段代码是错误的,在 Windows 下提示 __linu

  • 上一个小节 C 语言的程序结构中我们简单的认识了一下 C 语言的程序到底由那些部分组成,但是仅仅了解 C 语言的程序结构还不够,仅仅是万里长征走完了第一步,后面还需要进行很多的步骤才能让程序成为一个可以使用的工业产品。还记的上一个小节中我们提到的 gcc 吗?其实这是一个 C 语言的编译器,这一个小节我们就来学习一下编译器这个概念。 1. C 语言编译器 每个语言都需要编译器,甚至包括可以直接操作

  • 问题内容: 我正在尝试更好地理解它们之间的区别。我在网上找到了很多解释,但是它们倾向于抽象的差异,而不是实际的含义。 我的大部分编程经验都来自CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可以从以编译语言编写的程序中分发可执行文件这一事实之外,每种类型是否有优点/缺点?通常,我听到人们争辩说解释语言可以交互使用,但是我相信编译语言也可以

  • 问题内容: 我正在尝试更好地理解它们之间的区别。我在网上找到了很多解释,但它们倾向于抽象的差异,而不是实际的含义。 我的大部分编程经验都来自CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可以从以编译语言编写的程序中分发可执行文件这一事实之外,每种类型是否有优点/缺点?通常,我听到人们争辩说解释语言可以交互使用,但是我相信编译语言也可以具

  • 安装编译器或者 IDE(集成开发环境),也叫搭建开发环境。Windows 下的C语言 IDE 众多,多如牛毛,初学者往往不知道该如何选择,本节就来给大家指点迷津。 1) Visual Studio Windows 下首先推荐大家使用微软开发的 Visual Studio(简称 VS),它是 Windows 下的标准 IDE,实际开发中大家也都在使用。为了适应最新的 Windows 操作系统,微软每

  • 本文向大家介绍解析C语言与C++的编译模型,包括了解析C语言与C++的编译模型的使用技巧和注意事项,需要的朋友参考一下 首先简要介绍一下C的编译模型: 限于当时的硬件条件,C编译器不能够在内存里一次性地装载所有程序代码,而需要将代码分为多个源文件,并且分别编译。并且由于内存限制,编译器本身也不能太大,因此需要分为多个可执行文件,进行分阶段的编译。在早期一共包括7个可执行文件:cc(调用其它可执行文