c - 使用 NativeCall 在不同平台上处理 C typedef
问题描述
是否有一种方便的方法来处理在不同平台上可能具有不同价值的 C typedef?
例如
#if defined(_WIN32)
#define foo_t int32_t
#elif defined(_WIN64)
#define foo_t int64_t
#else
#define foo_t long
#endif
void handle_foo(foo_t* in) {
...
}
目前我正在像这样在 Perl 6 中处理这个
sub handle_foo32(int32 is rw) is native(Str) { * }
sub handle_foo64(int64 is rw) is native(Str) { * }
sub handle_foo00(long is rw) is native(Str) { * }
sub handle-foo(Int $in) {
if $*DISTRO.is-win {
given $*KERNEL.bits {
when 32 {
handle_foo32(my int32 $ = $in);
}
when 64 {
handle_foo64(my int64 $ = $in);
}
}
} else {
handle_foo00(my long $ = $in);
}
}
解决方案
也许最直接的翻译是用来constant
引入一个新符号,在编译时计算。
my constant foo_t = do if $*DISTRO.is-win {
given $*KERNEL.bits {
when 32 { int32 }
when 64 { int64 }
}
} else {
long
}
绑定到类型对象的常量就像类型一样,可以在签名中使用。
sub handle_foo(foo_t is rw) is native { * }
推荐阅读
- c# - Microsoft Unity HierarchicalLifetimeManager 死锁
- c++ - 单例模式中的手动析构函数调用:多次调用
- jquery - 动态添加到表中的按钮不起作用 Jquery
- ruby-on-rails - 尝试在不中断 Rails 服务器的情况下运行 Python 脚本
- json - 在 Go 中编辑 Json 而不首先解组为结构
- node.js - 具有任何端口的 AWS localhost
- javascript - 当球与矩形碰撞时如何改变角度?
- c - Glove.c 中的分段错误(核心转储)
- angular - 为输入字段选择浏览器建议时,Angular Pipe 不起作用
- python - 运行 Python 脚本时命令提示符打开和关闭