在C函数中发出无效参数信号[已关闭]

u0njafvf  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(123)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

5天前关闭。
Improve this question
我有一个函数,希望禁止调用者输入无效值(width or height〈=0).在Java或C++中我会抛出异常,但在C中没有这样的事情。我读到过一种方法是创建一个带有错误代码的枚举并返回它们,然而,这将需要改变函数的签名(从void到int),如果可能的话,我希望避免这种情况。目前的解决方案可能会导致不可预测的输出,感觉不对。

void set_dimensions(int width, int height, struct rectangle_t* rectangle){
    if(width<=0||height<=0){
        //The problematic part
        rectangle->width=1;
        rectangle->height=1;
        return;
    }
    rectangle->width = width;
    rectangle->height = height;
}

处理这种情况的最佳实践是什么?

vi4fp9gy

vi4fp9gy1#

目前的解决方案可能会导致不可预测的输出,它只是感觉不对。
1.使用assert()验证后置条件,或将消息记录到stderr并调用abort()

/* NOTE: assert() will be disabled in non-debug builds. */

assert (width > 0 && height > 0)

/* Or */

if (width <= 0 || height <= 0) {
    fprintf (stderr, /* Error message */ );
    abort();
}

1.接受一个out参数作为指针,并使用它返回一个错误代码。

void set_dimensions(int width, int height, struct rectangle_t* rectangle, int *err_status)

1.将函数的返回类型从void更改为int,然后可以遵循POSIX约定,失败时返回-1,成功时返回0,或者类似的操作。

/* 
*  @return Upon successful return, set_dimensions() shall return 0.
*          Otherwise, -1 is returned to indicate failure.
*/
int set_dimensions(int width, int height, struct rectangle_t* rectangle) {
   ....
}
5t7ly7z5

5t7ly7z52#

您可以使用setjmplongjmp模拟类似于Java异常的内容:

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

jmp_buf error;

struct rectangle_t { int width, height; };

void set_dimensions(int width, int height, struct rectangle_t *rectangle)
{
    if (width <= 0 || height <= 0)
    {
        longjmp(error, 1);
    }
    else
    {
        rectangle->width = width;
        rectangle->height = height;
    }
}

int main(void) 
{
    struct rectangle_t rectangle;

    if (setjmp(error))
    {
        fprintf(stderr, "set_dimensions fail\n");
        exit(EXIT_FAILURE);
    }
    set_dimensions(0, 1, &rectangle);
}

相关问题