C 使用-1作为无效值(对于枚举和可能未知的值)是一种不好的做法吗

C 使用-1作为无效值(对于枚举和可能未知的值)是一种不好的做法吗,c,initialization,C,Initialization,使用-1作为枚举值的无效值(对于从0或更大开始的枚举)是不是一个坏主意。对于未初始化的值或不应再具有有效值的值。 如何测试函数如何处理无效数据 #define INVALID_ENUM_VALUE -1 如果随机uint值处于未初始化/无效状态(例如资源id),那么将其设置为-1怎么样 wraparound是否存在潜在问题?如果程序不是很复杂且运行时间不长,那么有效整数不太可能具有该值。我应该使用UINT_MAX吗?放弃使用bool来跟踪有效状态?如果所有整数都可能是代码中的好值,就像它们用于

使用-1作为枚举值的无效值(对于从0或更大开始的枚举)是不是一个坏主意。对于未初始化的值或不应再具有有效值的值。 如何测试函数如何处理无效数据

#define INVALID_ENUM_VALUE -1
如果随机uint值处于未初始化/无效状态(例如资源id),那么将其设置为-1怎么样


wraparound是否存在潜在问题?如果程序不是很复杂且运行时间不长,那么有效整数不太可能具有该值。我应该使用UINT_MAX吗?放弃使用bool来跟踪有效状态?

如果所有整数都可能是代码中的好值,就像它们用于(比如)加法一样,那么使用-1(或任何数值)来指示错误或未知是没有意义的-您需要使用其他机制,或者干脆忽略错误。

以下是我使用的方法:

  • 如果使用的是
    枚举
    ,请为“无效状态”添加另一个值
  • 如果有一个函数返回,例如
    int
    ,则:
    • 返回一个具有额外字段的
      struct
      (例如
      valid\u result
      error
      ),或
    • 取一个指针,指向为结果修改的
      int
      ,并让返回值报告错误

嗯,这取决于什么是有效值。如果你没想到会有这么大的数字-好的。如果您不希望有0(例如,某些计时器),请使用0。如果您希望有一些溢出(对某些模运算使用int的大小),那么-1不是一个好主意,等等。这确实取决于很多事情。如果不是您的enum(库enum)呢?@Roman-ah,那么它就比较棘手,但这些方法可能仍然适用。例如,如果库函数可以返回任何
int
(偶数-1),但要指示未初始化的值,则仍然可以使用带有“Initialized”标志的结构来包装该值。如果您有一个从这样一个函数返回值的函数,但只有在遵循某些代码路径的情况下,您仍然可以使用上述任何一种方法。这有意义吗?
#define INVALID_UNINT_VALUE -1