我有一些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;
}
如注释中所述,可以使用宏执行此操作:
#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;
你可能会发现这个问题的答案很有帮助。虽然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提交了一个支持请求,但当时他们有一些支持积压,所以我的请求被关闭了。