Perl:如何将所有内联C代码放入单独的文件中?

这个问题很简单,我可以感受到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,但我想知道这个问题是否没有更优雅的解决方案?

您可以将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; 

至少在Inline的最新版本中,您可以在使用Inline时简单地指定文件名而不是字符串:

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

需要注意的是,Inline :: C使用简单的正则表达式方法来确定其参数“看起来像”文件名,这就是“./”部分重要的原因。 使用#line 1 test.c指令启动C文件也是个好主意,因此C调试器会知道它。