【问题标题】:C: field has incomplete typeC:字段类型不完整
【发布时间】:2013-06-25 07:12:19
【问题描述】:

如果之前有人问过这个问题,我深表歉意。

通过 make 编译时出现以下错误:

.../inc/intModIp.h:418: error: field 'cnc_id' has incomplete type
../inc/intModIp.h:419: error: field 'cnc_key' has incomplete type
../inc/intModIp.h:421: error: field 'fin_id' has incomplete type
../inc/intModIp.h:422: error: field 'fin_key' has incomplete type
../inc/intModIp.h:424: error: field 'remote_id' has incomplete type
../inc/intModIp.h:426: error: field 'cnc_ipsec_peer' has incomplete type
../inc/intModIp.h:427: error: field 'fin_ipsec_peer' has incomplete type
../inc/intModIp.h:428: error: field 'remote_ipsec_peer' has incomplete type
../inc/intModIp.h:430: error: field 'cnc_link' has incomplete type
../inc/intModIp.h:431: error: field 'cnc_esp' has incomplete type
../inc/intModIp.h:433: error: field 'fin_link' has incomplete type
../inc/intModIp.h:434: error: field 'fin_esp' has incomplete type

头文件中的相应代码如下:

#if 1 || defined(SYMB_IPSEC)
    struct ipsec_state {
        int enabled;
        int active;
        int timer;
/* IPSEC_SOCKET_STATES */

        struct ipsec_id cnc_id;
        struct ipsec_priv_key cnc_key;

        struct ipsec_id fin_id;
        struct ipsec_priv_key fin_key;

        struct ipsec_id remote_id;

        struct ipsec_peer cnc_ipsec_peer;
        struct ipsec_peer fin_ipsec_peer;
        struct ipsec_peer remote_ipsec_peer;

        struct ipsec_ike_link cnc_link;
        struct ipsec_esp_sa cnc_esp;

        struct ipsec_ike_link fin_link;
        struct ipsec_esp_sa fin_esp;
    } ipsec;
#endif

有人可以帮我解决这个问题吗? 如果需要任何其他信息,请告诉我。

谢谢, 晴天

【问题讨论】:

  • 看来您需要包含声明每个结构的标头。
  • 好像struct ipsec_id 和其他在struct ipsec_state 之后声明的或根本没有声明的。

标签: c makefile


【解决方案1】:

问题可能是所有这些结构都是向前声明的。

struct ipsec_state之后是否包含标头?:

/* a.h */

struct a {
    int i;
};

/* demo.c */

struct b {
    struct a A;
};

#include "a.h"

int main(void)
{
    return 0;
}

输出:

david@debian:~$ gcc -std=c99 -Wall -pedantic -W -Wextra -o demo demo.c
demo.c:2:11: error: field ‘A’ has incomplete type

【讨论】:

    【解决方案2】:

    编译器找不到声明的结构定义(ipsec_id ... ipsec_esp_sa),您可能需要包含相关的头文件

    【讨论】:

    • 确保包含的标头不受某些 MACRO 定义的保护。类似于#if IPSEC
    【解决方案3】:

    该错误的一个来源(字段类型不完整)是当您在 alias(通过 typedef 定义的变量)前面使用 struct 关键字时。尝试删除 struct 关键字。

    【讨论】:

      【解决方案4】:

      为结构成员放置指针。

      struct ipsec_state {
              int enabled;
              int active;
              int timer;
      /* IPSEC_SOCKET_STATES */
      
              struct ipsec_id *cnc_id;
              struct ipsec_priv_key *cnc_key;
      
              struct ipsec_id *fin_id;
              struct ipsec_priv_key *fin_key;
      
              struct ipsec_id *remote_id;
      
              struct ipsec_peer *cnc_ipsec_peer;
              struct ipsec_peer *fin_ipsec_peer;
              struct ipsec_peer *remote_ipsec_peer;
      
              struct ipsec_ike_link *cnc_link;
              struct ipsec_esp_sa *cnc_esp;
      
              struct ipsec_ike_link *fin_link;
              struct ipsec_esp_sa *fin_esp;
          } ipsec;
      #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        相关资源
        最近更新 更多