c++ - 嵌入式 C - 我应该使用哪种类型的错误代码?签名与未签名

标签 c++ c

我最近为嵌入式系统编写了大量 C 代码,我总是想知道我是否应该使用有符号或无符号值作为我的返回类型。有“正确”的方法吗?

我个人更喜欢签名类型,因为它们给了我更广泛的表达 self 的范围。但我使用了大量仅使用无符号类型的遗留代码。

示例 1(我的代码):

int16_t my_initializer(void)
{
  return -1; //-> error (critical)
 ...
  return 0;  //-> everything is OK
 ...
  return 1;  //-> warning (non critical)
 ...
  return 2;  //-> another warning
}

示例 2(旧代码):

uint16_t my_initializer(void)
{
  return 0;  //-> everything is OK
 ...
  return 1;  //-> warning (non critical)
 ...
  return 2;  //-> another warning or an error
 ...
}

我查看了 linux 内核编码风格和 Google C++ 风格指南,但没有发现是否使用有符号类型或无符号类型的线索。 有没有“最佳实践”?

最佳答案

如果返回值始终用于返回状态,我更愿意发出一个描述性值,例如

 enum errorcode
 {
     SUCCESS,
     OUT_OF_MEMORY,     
     INVALID_ARGUMENT,   // Like -1 to sqrt
     OUT_OF_RANGE,       // Indexing into an array or similar.
 };

 errorcode status = my_function();

这还具有使用符号进行调试的优点,在调试器中您会得到如下内容:

gdb> p status
SUCCESS
...
gdb> p status
OUT_OF_MEMORY

而不是试图记住 1 是否内存不足或其他情况。

很难确定某件事是“警告”还是“错误”。覆盖现有文件是错误还是只是警告?如果您已经覆盖了现有文件,收件人代码会对“警告”做什么? return WARN_FILE_EXISTED; 在这里并不完全有帮助,因为调用者在那里无法有意义地实现任何目标 - 要么有一个标志说“不覆盖现有文件”或“覆盖现有标志”(或两个独立的功能等)

关于c++ - 嵌入式 C - 我应该使用哪种类型的错误代码?签名与未签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48840652/

相关文章:

c++ - 部分填充模板作为模板template的参数

调用系统 UNIX - C 中的文件复制

c# - 将字符串从 C# 传递到 C DLL

c - 函数原型(prototype)在什么情况下必须包含参数名称?

c - 在 C 语言中,是否可以像在 char 数组声明中初始化字符串一样在指针声明中初始化字符串?

c++ - 继承错误后访问方法

c++ - 如何在 std::function 的签名上重载构造函数?

c++ - 使用 ostringstream 导致程序崩溃

c++ - 我可以在 printf 中需要整数的地方传递一个字符吗?

c - 将文件中的字符串分配给字符串数组时遇到问题