【问题标题】:Is there a good way to force type incompatibility in C?有没有一种在 C 中强制类型不兼容的好方法?
【发布时间】:2011-03-09 13:49:46
【问题描述】:

出于类型检查的目的,我想在以下行定义一个函数

void myfunc(type1 a, type2 b)
{
...
}

其中type1type2 都被定义为uint8_t。到目前为止一切都很好,但出于理智和检查目的(想想 DbC),我想防止函数被调用,第一个参数为 type2 值或第二个参数为 type1。可悲的是,C 的隐式类型转换在这里对我不利。有人知道方法吗?

【问题讨论】:

标签: c type-conversion typechecking


【解决方案1】:

您可以将这两种类型包装在一个 Struct 中。

typedef struct {
    uint8_t data;
} type1;

typedef struct {
    uint8_t data;
} type2;

编辑: 我不喜欢它,因为您现在必须使用 a.data 而不是 a

【讨论】:

  • 为什么说不好?意图很明确:类型不同。
  • 是的,这是正确的。尽管有这个名字,typedef 实际上并没有在 C 中引入新类型 - 只有 structunion 这样做。
  • 我同意必须使用 a.data 有点不方便,除了它对我来说似乎很干净。谢谢!
  • 抱歉,将最后一条评论读作“虽然有点不方便,但它似乎仍然是一个相当干净的解决方案”。
【解决方案2】:

我认为您可以使用 struct 包装您的类型,然后将指针传递给这些结构。

【讨论】:

  • 您甚至可以传递结构本身而不是指针。结构不必通过 ref 传递,它们可以通过值传递(在这种情况下,整个结构内容都会被复制;所以对于大结构来说不是一个好主意)。如果结构本身不大于指针引用的大小,则按值传递它们没有开销。
猜你喜欢
  • 2021-09-05
  • 2010-11-10
  • 2011-10-27
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多