2010-11-15 21 views
15

यह समस्या इतनी सरल है कि मैं आरटीएफएम के आने का अनुभव कर सकता हूं। हालांकि, मैं दस्तावेज़ों को देख रहा हूं (Inline, Inline-C, Inline-C-Cookbook) सभी सुबह और मैं इस समस्या को हल करने का तरीका नहीं समझ सकता।पर्ल: मैं अपने सभी इनलाइन सी कोड को एक अलग फ़ाइल में कैसे रख सकता हूं?

मैं इनलाइन सी का उपयोग करना चाहता हूं, लेकिन मैं अपने कोड कोड के समान फ़ाइल में सी कोड नहीं चाहता हूं।

(Emacs को एक फ़ाइल में दो भाषाओं को पसंद नहीं है। सिद्धांत रूप में यह सुविधा का मामला है, लेकिन व्यावहारिक रूप से मुझे एक फ़ाइल में अपना सी संपादित करना है, फिर इसे मेरी पर्ल स्क्रिप्ट में कॉपी करें।)

यहाँ काम कर रहा है पर्ल:

#!/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 करने के लिए धन्यवाद)

मैं एक में या के रूप में ज्यादा संभव के रूप में) सी कोड के सभी (ले जाना चाहते हैं। अलग हेडर फ़ाइल।

मैं क्या एक हैडर में sum1 डाल दिया है सकते हैं, और ऐसा करते हैं:

# same perl as above except now say sum2 instead of sum1 
__END__ 
__C__ 
#include "sum.h" 

double sum2(AV* array) { 
    sum1(array); 
} 

यह काफी अच्छा मैं अब पर्ल मोड में सी संपादित करने के लिए है के रूप में है, लेकिन मुझे आश्चर्य है कि अगर वहाँ isn इस समस्या के लिए एक और अधिक सुरुचिपूर्ण समाधान नहीं है?

+0

यह सुंदर सुरुचिपूर्ण दिखता है। –

+0

@ पेड्रो सिल्वा दर्शक की आंख और सब कुछ। बस मेरे लिए थोड़ा अनावश्यक लगता है। – flies

उत्तर

21

आप एक अलग फाइल में अपनी सी कोड डाल दिया और 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

धन्यवाद! मुझे यह जानकर आश्चर्य हुआ कि यह समाधान प्रत्येक निष्पादन पर पुन: संकलित नहीं होता है। इनलाइन स्मार्ट है! – flies

2

कम से कम इनलाइन के संस्करणों के साथ, आप इनलाइनिंग के दौरान स्ट्रिंग के बजाय फ़ाइल नाम निर्दिष्ट कर सकते हैं:

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

यहां चेतावनी यह है कि इनलाइन :: सी यह निर्धारित करने के लिए एक सरल रेगेक्सप दृष्टिकोण का उपयोग करता है कि क्या यह तर्क फ़ाइल नाम जैसा दिखता है, यही कारण है कि "./" भाग महत्वपूर्ण है। #line 1 test.c निर्देश के साथ अपनी सी फ़ाइल शुरू करना भी एक अच्छा विचार है, इसलिए सी डीबगर इसके बारे में जानेंगे।

संबंधित मुद्दे