Обработка C typedef на другой платформе с помощью NativeCall - PullRequest
0 голосов
/ 21 мая 2018

Есть ли удобный способ обработки 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Возможно, наиболее прямым переводом является использование 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 { * }
0 голосов
/ 21 мая 2018

Я так не думаю.Но поскольку $*DISTRO.is-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;

За исключением того, что это, конечно, не поможет вам с параметрами разных размеровдля каждой версии.Поэтому я думаю, вам понадобится еще один слой косвенности для этого.

Возможно, для вдохновения вот как я справлялся с подобными проблемами: https://github.com/lizmat/P5getpwnam/blob/master/lib/P5getpwnam.pm6

...