当前位置: 首页 > 知识库问答 >
问题:

如何在不复制代码的情况下创建不可转换的C类型?

颜志业
2023-03-14

我有一些C代码,其中包含各种函数,每个函数都以不同类型的“handle”对象作为参数。所有这些句柄的实现都是相同的(它只是一个具有void指针和项计数的结构),因此只声明一个实现似乎是合乎逻辑的——但我还希望C编译器在用户将错误类型的句柄传递给函数时生成编译时错误。

我当前的方法使用类型定义创建各种句柄类型,它可以记录函数应该接受的句柄类型,但编译器会自动转换,因此不会将类型不匹配标记为错误。是否有一种推荐的方法来实现这一点,即不需要手动复制每种类型的句柄结构声明?

玩具示例代码如下:

typedef struct _FruitHandle {
   int _numItems;
   void * _items;
} FruitHandle;

typedef FruitHandle AppleHandle;
typedef FruitHandle BananaHandle;
// imagine a number of other fruits as well

void EatAnApple(AppleHandle a) {}
void EatABanana(BananaHandle b) {}
// and so on -- each function should ONLY except its own fruit-handle-type as an argument!

int main(int argc, char ** argv)
{
   AppleHandle apple;
   BananaHandle banana;

   EatAnApple(apple);  // ok -- types match
   EatABanana(banana); // ok -- types match

   EatAnApple(banana); // type mismatch -- I want this to be a compile-time error, but it isn't!
   EatABanana(apple);  // type mismatch -- I want this to be a compile-time error, but it isn't!

   return 0;
}

共有2个答案

郏志诚
2023-03-14

如注释中所述,可以使用宏执行此操作:

#define FRUIT(name) typedef struct _##name {\
   int _numItems;\
   void * _items;\
} name

FRUIT(AppleHandle);
FRUIT(BananaHandle);

这扩展到:

typedef struct _AppleHandle { int _numItems; void * _items;} AppleHandle;
typedef struct _BananaHandle { int _numItems; void * _items;} BananaHandle;
柯冯浩
2023-03-14

你可能会发现这个问题的答案很有帮助。虽然C中没有显式的类型继承,但您可以使用顶部答案中描述的习惯用法来创建AppleHandle和BananaHandle。

typedef struct {
    int _numItems;
    void *_items;
} FruitHandle;

typedef struct {
    FruitHandle fruit_handle;
} AppleHandle;

typedef struct {
    FruitHandle fruit_handle;
} BananaHandle;

...
 类似资料:
  • 我可以在不破坏用户代码的情况下将类转换为模板类吗?我试图更改一个类以接受模板参数,但同时,我希望避免破坏现有的客户机代码。更详细地说,现有的代码库是 我将此转化为以下内容: 为有效地编写了非模板化代码。当代码在没有C17(或更高版本)支持的情况下编译时,我能做些什么使现有代码不会中断吗?例如,以下内容应有效: 我感谢任何提示或建议!

  • 假设我有这个方法: 我想调用这个方法,获取字符串,将该字符串转换为整数7,然后以非阻塞方式返回该整数。我该怎么做? 我试过这个,但是函数阻塞(同步): 我尝试使用代替(异步): 但是我得到了这个错误:<代码>类型不匹配:无法从int转换为Mono 那我该怎么办?

  • 本文向大家介绍如何在不使用HTML的情况下创建网站?,包括了如何在不使用HTML的情况下创建网站?的使用技巧和注意事项,需要的朋友参考一下 如果您不了解HTML或CSS,并且想创建一个网站,那么不用担心,您可以轻松创建网站,而无需编写一行HTML代码。 以下是一些无需编写任何HTML或代码行即可构建网站的方法: 网站构造函数 当您购买网站托管计划时,托管公司将为您提供免费的网站构建器选项,以轻松创

  • 我即将对我的项目进行一个重大的技术更改,从ANT转移到Gradle。这个项目从来没有发布过--它仍在开发中。我想标记最后的旧技术版本,以便可以找到参考或逆转。但我不想暗示有任何一种释放。 然后 我之前向GitHub提交了一个支持请求,但当时他们有一些支持积压,所以我的请求被关闭了。