这个问题很简单,我可以感受到RTFM的到来。但是,我整个上午都在查看文档(Inline,Inline-C,Inline-C-Cookbook),我无法弄清楚如何解决这个问题。
我想使用内联C,但我不想在与perl代码相同的文件中使用C代码。
(Emacs不喜欢在一个文件中使用两种语言。原则上这是方便的,但实际上我必须在一个文件中编辑我的C然后将其复制粘贴到我的perl脚本中。)
以下是perl:
#!/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;
}
(感谢mobrule让我走到这一步。)
我想将所有C代码(或尽可能多)移动到单独的头文件中。
我可以做的是将sum1
放入标题中,然后执行此操作:
# same perl as above except now say sum2 instead of sum1
__END__
__C__
#include "sum.h"
double sum2(AV* array) {
sum1(array);
}
这已经足够好了,因为我不再需要在perl模式下编辑C,但我想知道这个问题是否没有更优雅的解决方案?
答案 0 :(得分:22)
您可以将C代码放在单独的文件中,并使用Inline::bind
在运行时加载
use Inline;
use File::Slurp;
my $data = read_file('source.c');
Inline->bind(C => $data);
或在BEGIN {}
块中加载源代码以在编译时绑定它
my $data;
use File::Slurp;
BEGIN {
$data = read_file('source.c');
}
use Inline C => $data;
答案 1 :(得分:2)
至少在Inline的最新版本中,您可以在使用Inline时简单地指定文件名而不是字符串:
use Inline C => "./test.c";
这里需要注意的是,Inline :: C使用一种简单的正则表达式方法来确定其参数是否“看起来像”一个文件名,这就是“./”部分很重要的原因。使用#line 1 test.c
指令启动C文件也是一个好主意,因此C调试器会知道它。