gpt4 book ai didi

c - 在同一结构中使用结构成员作为数组大小

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:11 25 4
gpt4 key购买 nike

我是结构化c编码的新手,我不知道我是否可以定义一个结构如下:

typedef struct command_struct {
uint8_t com_byte_num;
uint8_t command_bytes[com_byte_num];
} command;

并在另一个结构中使用它:

typedef struct commands_struct {
command poll_dig;
command poll_joy;
command poll_all;
command enter_config;
command exit_config;
command conf_set_analog;
command conf_set_digital;
command conf_vib_off;
command conf_joy_only;
command conf_joy_press;
} commands;

uint8_t command_bytes[com_byte_num]; 部分我不确定。

最佳答案

您不能在标准 C 中执行 uint8_t command_bytes[com_byte_num]; — 数组大小必须固定(常量)或者您需要符号 uint8_t command_bytes[];,称为“灵活数组成员”。

(但是,请参阅另一个关于 VLAIS 的答案 — 结构中的可变长度数组。但是请注意,此类数组只能由 GCC 编译,并且只能在函数内部定义,这非常复杂将指向此类结构的指针传递给其他函数的过程。)

如果使用灵活的数组成员,则无法创建第二个结构。如果它包含指向 command 元素的指针,则可以这样做,但如果它包含实际的 struct command 元素,则不能。将发生以下两种情况之一:

  1. 编译器提示你做不到。
  2. 编译器允许您这样做,但所有 command 元素都有一个零大小的 command_bytes 成员。

两者都对您没有帮助。给定代码:

#include <stdint.h>

typedef struct command_struct
{
uint8_t com_byte_num;
uint8_t command_bytes[];
} command;

typedef struct commands_struct
{
command poll_dig;
command poll_joy;
command poll_all;
command enter_config;
command exit_config;
command conf_set_analog;
command conf_set_digital;
command conf_vib_off;
command conf_joy_only;
command conf_joy_press;
} commands;

命令:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c fla.c

编译文件正常(在 Mac OS X 10.9.1 Mavericks 上使用 GCC 4.8.2)。如果你添加 -pedantic,那么你会得到一大堆错误,例如:

fla.c:11:13: error: invalid use of structure with flexible array member [-Werror=pedantic]
command poll_dig;

如果你把代码改成下图,再迂腐的编译也开心:

#include <stdint.h>

typedef struct command_struct
{
uint8_t com_byte_num;
uint8_t command_bytes[];
} command;

typedef struct commands_struct
{
command *poll_dig;
command *poll_joy;
command *poll_all;
command *enter_config;
command *exit_config;
command *conf_set_analog;
command *conf_set_digital;
command *conf_vib_off;
command *conf_joy_only;
command *conf_joy_press;
} commands;

关于c - 在同一结构中使用结构成员作为数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com