首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NativeCall在不同平台上处理C

用NativeCall在不同平台上处理C
EN

Stack Overflow用户
提问于 2018-05-21 12:56:41
回答 2查看 169关注 0票数 10

是否有一种在不同平台上具有不同价值的处理C类型胡枝子子的方便方法?

例如

代码语言:javascript
复制
#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中处理这个问题,如下所示

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 20:05:48

也许最直接的翻译是使用constant引入一个新的符号,在编译时计算。

代码语言:javascript
复制
my constant foo_t = do if $*DISTRO.is-win {
    given $*KERNEL.bits {
        when 32 { int32 }
        when 64 { int64 }
    }
} else {
    long
}

绑定到类型对象的常量就像类型一样,可以在签名中使用。

代码语言:javascript
复制
sub handle_foo(foo_t is rw) is native { * }
票数 9
EN

Stack Overflow用户

发布于 2018-05-21 13:11:16

我不这样认为。但是,由于$*DISTRO.is-win$*KERNEL.bits实际上是常量,所以您可以决定使用哪个版本来编译时:

代码语言:javascript
复制
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) { * }

my constant &handler = $*DISTRO.is-win
  ?? $*KERNEL.bits == 32
    ?? &handle_foo32
    !! &handle_foo64
  !! &handle_foo00;

当然,这不会帮助您处理每个版本的不同大小的参数。所以我想你需要另一层间接的帮助。

也许作为灵感,下面是我处理类似问题的方式:https://github.com/lizmat/P5getpwnam/blob/master/lib/P5getpwnam.pm6

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50449428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档