【发布时间】:2019-04-09 06:43:45
【问题描述】:
我最近想出了一种我认为在 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 文件)中声明不同的返回状态不会产生警告或错误。
【问题讨论】:
-
为什么不用 typedef?
-
你用哪个编译器编译这段代码? gcc 不高兴因为重新定义...
-
即使枚举器值相同,我也不相信这是合法的 C。如果枚举器值有任何不同,那么肯定不是这使得该技术无用。尽管如此,如果这些值与您提供的值相同,这是一个有趣的问题。
-
@Closers:这个观点是如何建立的?
-
每个文件都是独立有效和可用的。你不能做的是在
implementation.c中包含implementation.h——这意味着你失去了标题通常提供的交叉检查。
标签: c enums language-lawyer return-value