【问题标题】:What to return from function that returns a struct type in case of error? [duplicate]如果发生错误,从返回结构类型的函数返回什么? [复制]
【发布时间】:2018-08-13 21:07:42
【问题描述】:

我正在用 C 语言实现一个队列,并遵循使用尽可能少的动态内存的一般建议,为我的节点设置以下内容:

struct qnode {
    struct message_t message;
    struct qnode* next;
};

struct message_t {
    char prefix[BUF_SIZE];
    char command[CMD_MAXLEN];
    char params[MAX_PARAMS][BUF_SIZE];
};

由于我只处理 message_ts 而不是指向它们的指针,因此我的 dequeue 函数具有以下签名:

struct message_t dequeue(struct message_q* q);

如果出现错误(在我的情况下,如果队列为空怎么办),是否有关于从这种类型的函数返回什么的约定?现在,我返回一个 struct message_t,所有字段都设置为“0”。

我的另一种选择是在任何地方使用指向message_t 的指针,然后在出现错误时返回NULL。我想了解每种方法的优缺点,以及在我的具体案例中的一些最佳做法。

【问题讨论】:

  • 约定是改成bool dequeue(struct message_q* q, struct message_t* out)
  • 请参阅Error handling in C code 了解有关选项的全面讨论。您最好使用指示成功或失败的返回码并通过指针返回结果。
  • @JonathanLeffler 我认为这是重复的。你,看来,不是。为什么?
  • @Yunnosch:没有足够的信心单独使用 Mjölnir。它讨论了一般的错误策略,并且仅讨论了返回结构(而不​​是指向结构的指针)的巧合函数。但是,在其他人确认这是一个不错的重复选择后,我愿意将其关闭。
  • @JonathanLeffler 我明白了。我忘记了权力越大,责任越大(或者你当然有这种权力)。我非常尊重你不太早敲定的决定。我意识到我应该以接近投票的方式表达我的意见。

标签: c memory


【解决方案1】:

这对您来说不是一个完整的解决方案,但是这样的东西在未来将是非常可重复使用的。 我有一个用于非基于操作系统的 uController 固件的小任务(不在 RTOS 上下文中)处理程序。我更喜欢这样做。假设我有一组函数可以向队列添加/删除任务,检查队列是否已满/空,检查队列中是否存在任务等。

typedef enum {

    Q_SUCCESS = 1,
    Q_FULL,
    Q_EMPTY,
    Q_TASKDUPLICATE,
    Q_TASKNOTFOUND,
    MAX_QSTATES,
    Q_FAILURE = -1,

} eQStates_t ;

eQStates_t Queue_AddTask(eTasks_t Task);
eQStates_t Queue_DiscardTask0(void);
bool_t Queue_GetOccurance(eTasks_t Task);

为了给你一个如何使用它们的例子,让我们选择一个函数。

eQStates_t Queue_DiscardTask0(void)
{
    uint32_t iLoop = 0;

    // Check if the count is zero, should never be the case as an Idle task is always there, adding itself into the queue
    if(0 == Queue_GetCount())
    {
        return Q_EMPTY;
    }

    // Discard the position 0 Task from the queue

    // Shift the whole queue

    // Add Idle task to the end of the queue

    return Q_SUCCESS;
}

我同意这不是一个非常智能的代码来作为示例,但它可能会让您了解如何使用类似的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2017-09-25
    • 2017-10-13
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多