2012-02-22 2 views
5

वहाँ एक समारोह है? अपने संकलक का समर्थन करता हैक्या va_args तर्क वाले फ़ंक्शन को लपेटने का कोई तरीका है?</p> <pre><code>void some_function(int id,...); </code></pre> <p><strong>सवाल</strong>: है कि इस समारोह रैप करने के लिए एक तरह से

void wrapped_some_function(int id,...) 
{ 
    //do smth 
    some_function(id,...); 
} 
+0

http://stackoverflow.com/questions/9329440/process-va-args-in-c (के [सी में एक variadic समारोह की एक मंगलाचरण अग्रेषित करें] – BoBTFish

+0

संभव डुप्लिकेट http://stackoverflow.com/प्रश्न/150543/फॉरवर्ड-ए-इनवोकेशन-ऑफ-ए-वैरैडिक-फ़ंक्शन-इन-सी) – sth

+0

@ थोड़ा अंतर: मुझे फ़ंक्शन को लपेटने की आवश्यकता है ताकि मैं स्रोत फ़ंक्शन को संशोधित नहीं कर सकूं। और मुझे मेरा जवाब – 2r2w

उत्तर

5
जीसीसी के साथ

, __builtin_apply_args और __builtin_apply, प्रलेखित कर पर निर्भर करता है here, यह कर सकते हैं।
मानक सी के लिए, कोई रास्ता नहीं है (अन्य उत्तर सुझाव क्या काम कर सकते हैं, लेकिन यह 100% नहीं है जो आप पूछते हैं)।
लेकिन अगर some_function की भिन्नता है जो va_list (जैसे vprintfprintf की भिन्नता है), तो आप इसका उपयोग कर सकते हैं।

+0

ग्रेट चाहिए। क्या आप एमएस विजुअल स्टूडियो के लिए कुछ विकल्प इंगित कर सकते हैं? – 2r2w

+0

मुझे नहीं पता कि एमएस के लिए कोई विकल्प है या नहीं। – ugoren

1

तो variadic macros शायद आपको लगता है कि इस्तेमाल कर सकते हैं: यह कुछ इस तरह प्राप्त करने के लिए इसका मतलब है?

#define wrapped_some_function(id, ...) \ 
    do {         \ 
     /* Do something here... */  \ 
     some_function(id, __VA_ARGS__); \ 
    } while (0) 
+0

धन्यवाद मिला। लेकिन मुझे एक फ़ंक्शन – 2r2w

0

मुझे लगता है अपने आवरण समारोह "पता" नहीं है संकलन समय पर बहस पारित कर दिया (और उनके प्रकार) की वास्तविक संख्या, अन्यथा आप सिर्फ उन्हें निकालते हैं और लिपटे समारोह कह सकते हैं।

फिर यह केवल इनलाइन असेंबलर (इसलिए - प्लेटफार्म-निर्भर समाधान) का उपयोग कर हल करने योग्य है। यह भी कैसे वास्तव में क्या आप (यानी आप स्थानीय समारोह चर की जरूरत नहीं है) अपने आवरण के लिए ढेर को आरक्षित करने की आवश्यकता है, अपने कार्य रैप करने के लिए करना चाहते हैं और आदि

0

सामान्य स्थिति में ऐसा करने का कोई तरीका नहीं है, और क्योंकि कोई तरीका नहीं है कि कुछ_फंक्शन के निर्माता को समान कार्य vsome_function प्रदान नहीं किया जाना चाहिए ..., लेकिन va_list। परिवर्तनीय तर्क सूची के साथ फ़ंक्शन में इसका काउंटर भाग होना चाहिए, va_list वाला फ़ंक्शन होना चाहिए। कार्यों के जोड़े (printf, vprintf), (sprintf, vsprintf), (CString :: प्रारूप, CString :: FormatV) पर विचार करें।

4

चूंकि इसे सी ++: सी ++ 11 फीट भी टैग किया गया है।

#include <utility> // forward 

template<class... Args> 
void wrapped_some_function(int id, Args&&... args) 
{ 
    //do smth 
    some_function(id, std::forward<Args>(args)...); 
} 
+0

धन्यवाद। दिलचस्प। लेकिन मुझे जो चाहिए वह नहीं। मुझे सी फ़ंक्शन – 2r2w

+0

@ 2r4w की आवश्यकता है: क्षमा करें, लेकिन फिर इसे C++ टैग न करें। – Xeo

+0

मैंने गलत टैग हटा दिया है। लेकिन आपका जवाब उपयोगी था – 2r2w

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