将函数签名中的枚举声明为返回状态

丹尼尔·福克

我最近想出了一种我认为是在C代码中声明函数返回状态的奇怪方法。执行任务的功能通常会根据成功或错误返回状态代码。这通常以整数或枚举的形式发送,该枚举在文件(或另一个文件)中的其他位置声明。我发现通过在函数签名中声明枚举,我们可以:

  • 使可能的返回值接近函数签名
  • 每个函数都有一组唯一的返回值,避免使用未使用的值

例如:

// implementation.h
enum {
    OK,
    INTERNAL_ERROR,
    NO_PARAMETERS
} do_that();

// implementation.c
enum {
    OK,
    INTERNAL_ERROR,
    NO_PARAMETERS
} do_that() {
    if (this())
        return OK;
    else if (that())
        return NO_PARAMETERS;
    return INTERNAL_ERROR;
}

我从来没有见过有人使用过这种风格。有效吗 如果没有,为什么不呢?

我看到的一个缺点是,您必须在c文件和头文件中都声明可能的返回值,但这也使它更可用,并且在查看签名时可以直接清除。

另一个问题是,据我了解,即使在学究的c语言中,枚举类型之间也可以进行隐式转换,这意味着在函数声明和实现(c和h文件)中声明不同的返回状态不会生成警告或错误。

乔纳森·莱夫勒

一个主要问题是您不能使用编译器对标头和实现进行交叉检查,因为实现TU(转换单元)(即implementation.c在问题中)不能包含标头(implementation.h),因为枚举常量将是双重的定义,这是不允许的。这意味着编译器无法发现服务的提供者和使用者之间的不一致。使用者可以使用标题,但提供者(implementation.c)无法使用。

此外,只有一个功能可以使用OK(或INTERNAL_ERRORNO_PARAMETERS),其他功能的“无错误”状态需要使用不同的名称,而每个错误状态都需要使用不同的名称。因此,即使它可以用于单个功能,但即使是小型软件也不是一个实用的解决方案(但这不是一个好主意)。

顺便说一句,请注意,尽管有的声明do_that(),但标头或实现文件中都没有原型。该函数声明为参数不确定的名单-这是所有已知的是,它是不是一个正式的可变参数函数(没有省略号...),以及它的所有参数都受到了默认参数促销规则(大致为:charshort被晋升为int;float提升为double)。如果该函数不带参数,则应将其编写为do_that(void)这样,以便在声明完成后有一个可用的原型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用枚举类将整数值声明为常量?

如何将方法参数声明为任何枚举

为什么在方法签名中必须仅将某些异常声明为抛出

为什么在Java枚举中的构造函数只能声明为私有?

无法在golang中的主函数之外将函数声明为变量

如何通过Golang中的短变量声明为函数输入分配返回值?

声明要返回&(引用)的函数的签名

错误:声明为“ noreturn”的函数不应返回

将函数参数类型声明为自动

将模板函数声明为非模板函数的参数

如何将参数声明为没有返回值的函数?

TclOO:将变量声明为“类”级别或在构造函数中的区别

为什么在C#8.0中将局部函数声明为static

在声明为返回unique_ptr <Base>的函数中返回unique_ptr <Derived>

如何将变量的类型声明为可观察函数返回的类型?

为什么将匿名JavaScript函数声明为函数参数?

在C中“声明为函数”

从声明为void的函数返回整数值

如何将枚举声明为类型?

对象中的函数被声明为非函数

如果TestUtils.renderIntoDocument声明为匿名函数,则返回null

如何在函数签名中使用匿名枚举声明函数?

将现有函数声明为异步?

将 DLL 中的非导出函数声明为静态的原因

将列表中的数据声明为变量

是否可以将具有“自动”返回类型的模板函数声明为类的朋友?

将数组声明为 C 中的指针

c 中如何将字符串声明为函数的参数?

错误:将“operator*”声明为非函数