我最近想出了一种我认为是在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_ERROR
或NO_PARAMETERS
),其他功能的“无错误”状态需要使用不同的名称,而每个错误状态都需要使用不同的名称。因此,即使它可以用于单个功能,但即使是小型软件也不是一个实用的解决方案(但这不是一个好主意)。
顺便说一句,请注意,尽管有的声明do_that()
,但标头或实现文件中都没有原型。该函数声明为参数不确定的名单-这是所有已知的是,它是不是一个正式的可变参数函数(没有省略号...
),以及它的所有参数都受到了默认参数促销规则(大致为:char
与short
被晋升为int
;float
提升为double
)。如果该函数不带参数,则应将其编写为do_that(void)
这样,以便在声明完成后有一个可用的原型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句