से भिन्न होते हैं, मुझे यह लॉगिंग सिस्टम मिला है जिसके लिए मैं स्ट्रिंग मैनिपुलेशन में से कुछ को शॉर्टकट करना चाहता हूं।फंक्शन ओवरलोडिंग जहां पैरामीटर केवल इलिप्स
लॉगिंग सिस्टम का उपयोग कार्यात्मक मैक्रोज़ के माध्यम से किया जाता है जो उसके बाद एक फ़ंक्शन कॉल पर अग्रेषित होता है। जैसे #define Warning(...) LogMessage(eWarning, __VA_ARGS__);
।
लॉगमेसेज फिर snprintf
को एक नए बफर में करता है और फिर उस संदेश को जो भी लॉग लक्ष्य स्थापित किया जाता है उसे प्रस्तुत करता है; printf, OutputDebugString, आदि
दुर्भाग्य से, मैंने एक ऐसी समस्या में भाग लिया है जहां हमारे पास बफर पर्याप्त नहीं है, इसलिए आउटपुट कम हो जाता है। मुझे यह भी एहसास हुआ कि आउटपुट संदेश में प्रतिशत प्रतीक होने पर यह विधि विफल हो जाएगी, क्योंकि स्नप्रिंट va_args को संसाधित करने का प्रयास करेगा। आखिरकार, चूंकि हमारे अधिकांश लॉग संदेश va_args का उपयोग नहीं करते हैं, इसलिए यह स्ट्रिंग को कॉपी करने के लिए मूर्खतापूर्ण लगता है।
तो मेरे फ़ंक्शन प्रोटोटाइप को देखते हुए, क्या मुझे इलिप्स की उपस्थिति के आधार पर अधिभारित करने में सक्षम होना चाहिए? दूसरे शब्दों में, मुझे लगता है कि मैं की तरह कुछ कर सकते हैं सक्षम होना चाहिए:
LogMessage(LogLevel, const char* message, ...);
LogMessage(LogLevel, const char* message);
मेरे गूगल के प्रयास कुछ भी विशेष रूप से उपयोगी (बस मुझे दिखा रहा है कि दीर्घवृत्त अगर और कुछ नहीं करता है, से अलग से मेल खाएगी नहीं मिले मेरी आवश्यकताएं कुछ भी नहीं मैचों), और एक कार्यान्वयन पर मेरे प्रारंभिक स्टैब ने मुझे एक संदिग्ध फ़ंक्शन कॉल त्रुटि दी।
त्रुटि के साथ, मुझे बस यह स्वीकार करना चाहिए कि मैं ऐसा नहीं कर सकता, लेकिन मुझे आश्चर्य है कि यह केवल संकलक है जिसका उपयोग मैं कर रहा हूं या शायद मैं इसे गलत कर रहा हूं। मैं
// edited version of what I really have to remove our local APIs,
// please excuse minor errors
const char* message = NULL;
char buffer[512];
va_list args;
va_start(args, format);
if(strcmp(format, "%s") == 0) {
message = va_arg(args, const char*);
}
else if (strchr(format, '%') == NULL) {
message = format;
}
else {
vsnprintf(buffer, 512, format, args);
message = buffer;
}
va_end(args);
के साथ एक समान प्रभाव को प्राप्त कर सकते हैं ... लेकिन यह एक सामान्य मामला जो केवल मापदंडों पारित किया जा रहा की संख्या से जाना जा सकता है में बेकार लगता है। जैसे अगर इलिप्स कुछ भी मेल नहीं खाते हैं, तो अन्य फ़ंक्शन का चयन करें? यदि यह काम नहीं करता है, तो क्या कोई और तरीका है जिसे मैं कोशिश कर सकता हूं जिसके लिए उपयोगकर्ता को मैक्रो नाम से निर्णय लेने की आवश्यकता नहीं है जिसे फ़ंक्शन कहा जाएगा? ईमानदारी से यह "अपशिष्ट" के बारे में उतना ही नहीं है जब मुझे एहसास हुआ कि अगर किसी ने अपने लॉग संदेश में Error("Buffer not 100% full");
को खतरनाक रूप से कहा और परिणामस्वरूप "बफर 1007.732873e10ull" नहीं मिला।
संपादित करें: जबकि मेरे उदाहरण का उत्तर "ऐसा मत करो" द्वारा उत्तर दिया गया है, क्या प्रश्न का उत्तर ही दिया जा सकता है?
मुझे लगता है कि मुझे लगता है कि दर्शन नहीं खरीदते हैं, और मैं क्या स्वीकार में उदार मैं क्या भेजने में सतर्क रहना पसंद करते हैं। आईएमओ, अगर मैं उपयोगकर्ता के इरादे को दिव्य कर सकता हूं, तो मुझे चाहिए। अनुभवहीन प्रोग्रामर के कारण बस क्षेत्र में विफल होने वाला सॉफ़्टवेयर मेरे लिए अक्षम नहीं है। और मेरा मुद्दा स्पष्ट रूप से था कि मैं इन कार्यों को प्रिंटफ प्रारूप स्ट्रिंग्स * केवल * स्वीकार करने के रूप में दस्तावेज नहीं करना चाहता हूं, मैं चाहता हूं कि वे किसी भी तरह से जाएं। –
जैसे ही आप की अनुमति देने के printf शैली तर्क, आप * चाहिए * मान जब आप उन्हें देखते हैं कि वे क्या कर रहे हैं, अन्यथा जो लोग उन्हें व्यवहार कि आप उम्मीद कर पाने के लिए नहीं जा रहे हैं का उपयोग करना चाहते है कि कि। यह प्रिंटफ-स्टाइल तर्कों को प्रिंटफ-स्टाइल तर्क के रूप में संसाधित करने की कोशिश करने और मिश्रण करने के लिए काम नहीं करेगा। यह सिर्फ परेशानी के लिए पूछ रहा है। यह जांचना ठीक है कि स्ट्रिंग स्प्रिंटफ के लिए मान्य है या नहीं, लेकिन प्रिंटफ-स्टाइल तर्कों को स्वीकार करने के लिए इसे साफ़ रूप से काम करने की अपेक्षा न करें और उन्हें एक ही समय में अनदेखा करें। –
और विचार कितने समस्याओं वेब डेवलपर्स है क्योंकि ब्राउज़र बुरा एचटीएमएल स्वीकार करते हैं, मैं एक पल के लिए नहीं खरीदते हैं कि उदारतापूर्वक स्वीकार करने, लेकिन आप क्या भेजने में रूढ़िवादी जा रहा है एक अच्छा विचार है। अगर हम उस दर्शन के साथ वेब नहीं बनाया गया तो हम सभी बेहतर होंगे। यदि आप इससे बच सकते हैं तो इसे अपने कोड में न करें। निश्चित रूप से, इस तरह से कार्यक्रम जो त्रुटियों को कम करता है (यहां तक कि नए लोगों के लिए भी), लेकिन बेहतर काम करने की व्यर्थ आशा में परिशुद्धता का त्याग न करें। यह नहीं होगा –