加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:怎么把我所有的内联C代码放到一个单独的文件中?

发布时间:2020-12-15 21:13:20 所属栏目:大数据 来源:网络整理
导读:这个问题很简单,我可以感受到RTFM的来临.不过,我一直在看文档( Inline,Inline-C,Inline-C-Cookbook),我不知道如何解决这个问题. 我想使用内联C,但是我不想将C代码放在与我的perl代码相同的文件中. (Emacs不喜欢在一个文件中使用两种语言,原则上这是一个方便
这个问题很简单,我可以感受到RTFM的来临.不过,我一直在看文档( Inline,Inline-C,Inline-C-Cookbook),我不知道如何解决这个问题.

我想使用内联C,但是我不想将C代码放在与我的perl代码相同的文件中.

(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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读