【问题标题】:invalid use of undefined type when using typedef struct使用 typedef 结构时对未定义类型的无效使用
【发布时间】:2014-03-31 08:54:26
【问题描述】:

alsa_test.h 头文件包含以下代码:

struct alsa_device;
typedef struct alsa_device alsa_device;    
alsa_device *create_alsa_array(size_t n);

alsa_test.c 文件包括:

struct alsa_device 
{
 int card;
 int dev;
 char info[80];
};
typedef struct alsa_device alsa_device;    

alsa_device *create_alsa_array(size_t n) { 
  alsa_device *new = malloc(n * sizeof *new); 
  return new; 
};

我的 main.c 文件有以下内容:

#include "alsa_test.h"

int main (int argc, char *argv[]) {
     alsa_device *devices;
     create_alsa_array(devices,50);
     devices[0]->card=1;
}

我收到以下错误

error: invalid use of undefined type 'struct alsa_device'

任何想法为什么?

【问题讨论】:

    标签: c struct typedef


    【解决方案1】:

    你的问题在main(),这里

         devices[0]->card=1;
    

    此时devices是一个指向没有定义的结构体的指针。

    如果您想保持结构未定义,请在 alsa_test.c 中定义一个函数,该函数接受一个指向它的指针和一个整数(记得在头文件中添加一个原型)

    void setcard(struct alsa_device *dst, size_t index, int card) {
        dst[index].card = card;
    }
    

    并从main()调用它

    setcard(devices, 0, 1); // set card of device 0 to 1
    setcard(devices, 1, 42); // set card of device 1 to 42
    

    【讨论】:

    • 指针是没有定义的结构是什么意思?如何避免使用辅助函数?
    • setcard函数不允许修改第二个设备的卡。
    • 嗯,好的,我更改了函数以允许任何元素。
    • 如果您想避免使用辅助函数,您需要提供完整的结构定义以及需要了解内部结构的函数。
    【解决方案2】:

    你有两个选择:

    1. 您不想公开类型内部结构:您需要在接口中定义结构(即 alsa_test.h 文件)。
    2. 您不想公开类型内部结构:在接口中添加函数以访问结构字段

    添加 alsa_test.h

    void set_alsa_card(struct alsa_device * alsa_dev_list, int dev_id, int card);
    

    在 alsa_test.c 中

    void set_alsa_card(struct alsa_device * alsa_dev, int dev_id, int card)
    {
        (alsa_dev + dev_id)->card = card;
    }
    

    main.c:

    #include "alsa_test.h"
    
    int main (int argc, char *argv[]) {
         alsa_device *devices;
         devices = create_alsa_array(50);
         set_alsa_card(devices, 0, 1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2015-06-11
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多