2010-11-15 20 views
15

Bu sorun o kadar basit ki RTFM'nin geleceğini hissedebiliyorum. Ancak, tüm sabahları (Inline, Inline-C, Inline-C-Cookbook) belgelere bakıyorum ve bu sorunu nasıl çözeceğimi anlayamıyorum.Perl: Tüm inline C kodumu nasıl ayrı bir dosyaya koyabilirim?

Satır içi C'yi kullanmak istiyorum, ancak perl kodumla aynı dosyada C kodu almak istemiyorum.

(Emacs, bir dosyada iki dile sahip değildir. Prensipte bu bir rahatlık meselesidir, fakat pratikte C'yi tek bir dosyada düzenlemek zorundayım, sonra onu perl betiğine kopyalayıp yapıştırın.)

İşte

çalışıyor perl: uzak bana bunu almak için mobrule için

#!/usr/bin/perl 

use Inline C => DATA; 
use strict; 
use warnings; 
use List::Util qw(sum); 
use feature qw(say); 

my @array = (1..10); 
say "native perl: ", sum(@array), ", Inline C: ", sum1(\@array); 

__END__ 
__C__ 

double sum1(AV* array) { 
    int i; 
    double sum = 0.0; 
    for (i=0; i<=av_len(array); i++) { 
    SV** elem = av_fetch(array, i, 0); 
    if (elem != NULL) 
     sum += SvNV(*elem); 
    } 
    return sum; 
} 

(teşekkürler)

Ben içine C kodunun tüm (veya mümkün olduğunca) taşımak istiyorum. ayrı başlık dosyası.

Ne bir başlık içine sum1 konur yapmak ve bunu yapabilirsiniz:

# same perl as above except now say sum2 instead of sum1 
__END__ 
__C__ 
#include "sum.h" 

double sum2(AV* array) { 
    sum1(array); 
} 

Bu artık perl-modunda C düzenlemek zorunda olduğu yeterince iyidir, ama yoksa herhangi acaba Bu problem için daha zarif bir çözüm mü?

+0

Bu oldukça zarif görünüyor. –

+0

@Pedro Silva, bakanın gözü ve hepsi. sadece bana biraz fazla gibi görünüyor. – flies

cevap

21

Sen ayrı bir dosyada C kodu koymak ve derleme zamanında bağlamak için çalışma zamanı

use Inline; 
use File::Slurp; 

my $data = read_file('source.c'); 
Inline->bind(C => $data); 

veya BEGIN {} blokta kaynak kodunu yükleme adresinden yüklemek için Inline::bind kullanabilirsiniz

my $data; 
use File::Slurp; 
BEGIN { 
    $data = read_file('source.c'); 
} 
use Inline C => $data; 
+1

Teşekkürler! Her bir uygulamada bu çözümün yeniden derlenmediğini görünce şaşırdım. Inline akıllı! – flies

2

En azından Inline'ın son sürümlerinde, Inline satırını kullanırken bir dize yerine bir dosya adı belirtebilirsiniz:

use Inline C => "./test.c"; 

Burada yapılan uyarı, Inline :: C'nin argümanının bir dosya adına "benzeyip benzemediğini" belirlemek için basit bir regexp yaklaşımı kullanmasıdır, bu yüzden "./" kısmı önemlidir. Ayrıca C dosyanızı #line 1 test.c yönergesine göre başlatmak iyi bir fikirdir, bu yüzden C hata ayıklayıcısı bunu bilir.

İlgili konular