gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:30:50 25 4
gpt4 key购买 nike

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

最佳答案

您可以将您的 C 代码放在一个单独的文件中,并使用 Inline::bind 在运行时加载它

use Inline;
use File::Slurp;

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

或者在 BEGIN{} block 中加载源代码以在编译时绑定(bind)它

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

关于c - Perl:如何将所有内联 C 代码放入单独的文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com