2009-02-07 13 views

उत्तर

23

आप नहीं कर सकते। यह कंपाइलरों में बनाया गया है ताकि आप कार्यों को अधिभारित कर सकें और विभिन्न वर्गों और ऐसी सामग्री में समान नाम के साथ कार्य कर सकें। लेकिन आप उन कार्यों को लिख सकते हैं जो सी कार्यों की तरह उलझन में हैं। जिन्हें सी कोड से बुलाया जा सकता है। लेकिन उन अतिभारित नहीं किया जा सकता और "सामान्य" सी ++ समारोह संकेत से नहीं कहा जा सकता:

extern "C" void foo() { 

} 

ऊपर समारोह अपने संकलक के लिए सी कार्यों की तरह घायल कर दिया जाएगा। इसमें नाम पर कोई बदलाव नहीं हो सकता है, या इसके सामने किसी भी "_" जैसे कुछ बदलाव शामिल हो सकते हैं।

+0

बस एक छोटी सी निट पर परीक्षण किया गया: इस तरह के कार्यों निश्चित रूप से ++ समारोह संकेत सी से कहा जा सकता है: extern "सी" शून्य foo() {printf ("foo \ n"); } int मुख्य() { शून्य (* एफ)(); एफ = foo; एफ(); } –

+0

मुझे लगता है कि आपका मतलब है "सी फ़ंक्शंस की तरह असम्बद्ध" :-) – paxdiablo

+4

पैक्स, सी कंपाइलर भी उलझ सकते हैं। उदाहरण के लिए जीसीसी में "-फ्लैडिंग-अंडरस्कोर" विकल्प है। मुझे याद है कि कुछ लड़के ने मुझे बताया कि मैकोक्स ने अपने सी नामों को अंडरस्कोर के साथ उलझाया है। (मेरे पास macosx नहीं है इसलिए मैं जांच नहीं कर सकता :))। –

7

आपका मतलब है कि आप लाइब्रेरी से अपना फ़ंक्शन निर्यात कर सकते हैं? extern "c" {}

6

अन्य तरीका:

नियंत्रण नाम असेंबलर संहिता में प्रयुक्त (gcc spec.)

आप नाम निर्दिष्ट कर सकते हैं एक सी समारोह या चर लेखन से लिए कोडांतरक कोड में इस्तेमाल किया जाएगा एएसएम (या __asm__) घोषणाकर्ता के बाद कीवर्ड। यह सुनिश्चित करने के लिए आप पर निर्भर है कि आपके द्वारा चुने गए असेंबलर नाम किसी भी अन्य असेंबलर प्रतीकों, या संदर्भ रजिस्टरों के साथ संघर्ष नहीं करते हैं।

इस तरह के कार्यों के लिए कोडांतरक नाम निर्दिष्ट करने के लिए, अपनी परिभाषा से पहले समारोह के लिए एक घोषणा लिख ​​सकते हैं और वहाँ एएसएम शब्दों में कहें,:

int func() asm ("MYFUNC"); 

int func() 
{ 

g++ यह संकलन होगा और nm -D उत्पादन

हो जाएगा
0000000000001e02 T MYFUNC 
बजाय

0000000000001e02 T _Z4funcv 

जी ++ 4.9.2

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