【问题标题】:Perl: how can I put all my inline C code into a separate file?Perl:如何将所有内联 C 代码放入单独的文件中?
【发布时间】:2013-11-21 02:08:12
【问题描述】:

这个问题很简单,我能感觉到 RTFM 的到来。但是,我整个上午都在查看文档(InlineInline-CInline-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,但我想知道是否有更优雅的解决方案来解决这个问题?

【问题讨论】:

  • @Pedro Silva 的旁观者之眼等等。对我来说似乎有点多余。

标签: c perl inline


【解决方案1】:

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

【讨论】:

  • 谢谢!我惊讶地发现这个解决方案不会在每次执行时重新编译。内联很聪明!
  • 如果'source.c'包含'source2.c'中定义的'source2.h',你知道如何编译和链接吗?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多