使用NativeCall在不同平台上处理C typedef

ara*_*ren 10 c perl6 nativecall raku

有没有一种方便的方法来处理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) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

目前我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ton 8

也许最直接的翻译是用于constant引入在编译时计算的新符号.

my constant foo_t = do if $*DISTRO.is-win {
    given $*KERNEL.bits {
        when 32 { int32 }
        when 64 { int64 }
    }
} else {
    long
}
Run Code Online (Sandbox Code Playgroud)

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

sub handle_foo(foo_t is rw) is native { * }
Run Code Online (Sandbox Code Playgroud)