2012-04-16 54 views
6

मैं वाला से सी मैक्रो का उपयोग करने की कोशिश कर रहा हूं। ऐसा लगता है कि यह सीसीओडी निर्देश के साथ संभव होना चाहिए लेकिन मैं इसका उपयोग करने के बारे में कोई सार्थक दस्तावेज नहीं ढूंढ पा रहा हूं।मैं वाला में सीसीओडी विशेषताओं का उपयोग कैसे करूं?

"The Hacker's Guide to Vala" और mailing list thread about calling a C macro from Vala with CCode में सीसीओडी तर्कों के बारे में एक संक्षिप्त खंड है।

लेकिन न तो संसाधन वास्तव में मुझे समझने में मदद करता है कि सीसीओडी वास्तव में क्या करता है। यह स्पष्ट रूप से प्रभावित करता है कि कैसे वाला Hackers' Guide to Vala से सी कोड उत्पन्न करता है, मैं यह समझ सकता हूं कि सीसीओडी निर्देश शायद मुझे सीधे प्रभाव देता है कि कैसे सीएलएएस पेड़ बनाया जाता है जब वालस एएसटी ट्रैवर्स किया जाता है।

क्या कोई भी सीसीओडी करता है और कुछ और बता सकता है?

+1

मुझे और दस्तावेज मिला: https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute –

उत्तर

8

दुर्भाग्यवश, सीसीओडी के बारे में बहुत कुछ दस्तावेज नहीं है जो अकेले समझ में आता है। आपको वैसा के साथ आने वाली वीएपीआई फाइलों के संयोजन के साथ इसका उपयोग करने की ज़रूरत है। मूल बात, तो आप शायद इस तरह अपने मैक्रो कुछ का उपयोग करेगा:

[CCode(cname = "FOO", cheader_filename = "blah.h")] 
public extern void foo(); 
यहाँ हम cname (यानी, नाम है कि सी कोड में उत्सर्जित हो जाएगा), और cheader_filename (यानी, सेट कर रहे हैं

हेडर फ़ाइल जो #include डी होना चाहिए)। अन्य सीसीओडी गुणों का नियंत्रण करता है कि सरणी कैसे नियंत्रित की जाती है। array_length = false इंगित करता है कि एक सरणी अज्ञात लंबाई है। इसे पैरामीटर या विधि पर लागू किया जा सकता है, जो दर्शाता है कि रिटर्न प्रकार पर लागू होता है। उदाहरण के लिए:

[CCode(array_length = false)] public int[] x(); 
[CCode(array_null_terminated = true)] public FileStream[] y(); 
public int[] z(); 

इस उदाहरण में, x अज्ञात सरणी लंबाई जबकि yFILE **y(void) की उम्मीद सी प्रोटोटाइप के साथ एक अशक्त-समाप्त सारणी रखने के लिए माना जाता है है और int *x(void) का एक उम्मीद सी प्रोटोटाइप होगा,। अंत में, z एक सरणी लंबाई बाहर पैरामीटर (यानी, int *z(int *length) के एक प्रोटोटाइप है, जहां length जहां लौटे सरणी।

ये सब भी मानकों को लागू किया जा सकता है की लंबाई को स्टोर करने के लिए एक सूचक है मानी जाती है। यह भी अगर वहाँ एक सरणी की लंबाई, लेकिन यह तर्क तुरंत सरणी के बाद नहीं है array_length_pos निर्दिष्ट करने के लिए उपयोगी है। एक पैरामीटर एक प्रतिनिधि है, तो target_pos निर्दिष्ट करता है जहां उपयोगकर्ता डेटा पारित हो जाता है (यानी, void* कि समारोह सूचक के साथ चला जाता)

प्रतिनिधियों, वर्गों और structs के साथ उपयोग के लिए कई प्रकार के सीसीओडी विशेषताओं भी हैं। instance_pos निर्दिष्ट करता है कि कहां वर्ग/संरचना उदाहरण या प्रतिनिधि उपयोगकर्ता डेटा जाता है। सभी स्थिति तर्क एक फ़्लोटिंग पॉइंट नंबर के साथ निर्दिष्ट हैं। यह एकाधिक पदों को एन्कोड करने की अनुमति देता है। उदाहरण के लिए, मान लीजिए हम एक सी प्रोटोटाइप था:

void foo(void* userdata, int length, double *dbl_array, void(*handler)(double,void*)); 

तो हम इस बारे में हो सकता है:

[CCode(cname = "foo")] 
public void foo([CCode(array_length_pos = 0.2)] double[] array, [CCode(target_pos = 0.1)] Handler func); 

को देखते हुए Handler कहीं और एक प्रतिनिधि के रूप में परिभाषित किया गया है, तो आप देख सकते हैं कि pos मूल्यों के बाद तर्क रखा तर्क 0 (यानी, शुरुआत) और फिर एक विशेष क्रम में।

वर्ग और structs initialisation, विनाश, और संदर्भ गिनती को संभालने के लिए कार्य करता है, लेकिन उन लोगों के लिए काफी सीधे आगे हैं। जेनरिक हैंडलिंग भी थोड़ा जटिल है। फिर, VAPIs अंतर्दृष्टि का सबसे अच्छा स्रोत हैं।हालांकि, यह आपके मूल सी कार्यों और मैक्रोज़ पर शुरू करने के लिए पर्याप्त है।