Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NativeCall在不同平台上处理C typedef_C_Raku_Nativecall - Fatal编程技术网

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

使用NativeCall在不同平台上处理C typedef,c,raku,nativecall,C,Raku,Nativecall,是否有一种方便的方法来处理在不同平台上可能具有不同值的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(in

是否有一种方便的方法来处理在不同平台上可能具有不同值的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);
    }
}

我不这么认为。但是,由于
$*发行版是win
$*KERNEL.bits
实际上是常量,因此您可以在编译时决定使用哪个版本:

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;
当然,这对每个版本的不同大小的参数没有帮助。所以我想你需要另一层的间接性


也许作为灵感,我是这样处理类似问题的:

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

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 { * }

不同的typedef及其条件背后是否有更深层次的逻辑?你想要实现什么?C的方法通常是使用一个头来定义所需的语义,而不是太在意细节。@Yunnosch:这是关于在不使用C编译器的情况下尝试与本机库接口。所以有一种方法可以直接使用头文件来获取正确的语义。