मुझे यकीन नहीं है कि संकलक सीधे कुछ संकलन झंडे प्रदान करके आपकी सहायता करेगा या नहीं। यदि यह करता है, तो आपके लिए अच्छा है। उसका उपयोग करें। कहानी का अंत।
यदि ऐसा नहीं होता है, तो शायद यह आपकी मदद करेगा। चूंकि आप अपना कोड सी से सी ++ में परिवर्तित कर रहे हैं, इसका मतलब है कि मेमसेट के सभी उपयोग std::
नेमस्पेस के बिना हैं। तो और इस तथ्य का लाभ लेने के #define memset
के रूप में:
#define memset memset_if_pod_else_error()
यहाँ memset_if_pod_else_error
एक समारोह आपके द्वारा लिखा है (यानी आप इसे लागू करने के लिए है)। आप इसे टेम्पलेट बना सकते हैं ताकि तर्क के प्रकार को कम किया जा सके और फिर यह पता लगाया जा सके कि प्रकार पीओडी है या नहीं। यदि यह पीओडी है, तो यह ठीक है और std::memset
आंतरिक रूप से कॉल करें, अन्यथा त्रुटि बढ़ाएं।
मेटाफंक्शन जैसे std::enable_if
और std::is_pod
इस फ़ंक्शन को लागू करने में आपकी सहायता करेंगे।
यहाँ इस विचार का एक न्यूनतम डेमो है:
#include <iostream>
#include <type_traits>
#include <cstring>
auto ptr_memset = std::memset; //store this a pointer
template<typename T>
using VoidPtr = typename std::enable_if<std::is_pod<T>::value, void*>::type;
#define memset memset_if_pod_else_error
template<typename T>
VoidPtr<T> memset_if_pod_else_error(T *data, int ch, size_t count)
{
return ptr_memset(data, ch, count);
}
struct pod {};
struct nonpod { nonpod() {} };
int main()
{
pod p;
nonpod np;
memset(&p, 0, sizeof(p));
memset(&np, 0, sizeof(np)); //this is error!
}
memset
को दूसरी कॉल इस त्रुटि उत्पन्न करता है:
error: no matching function for call to 'memset_if_pod_else_error'
memset(&np, 0, sizeof(np));
^~~~~~
Online Demo।
आशा है कि मदद करता है।
क्या 'memset' के लिए grep'ing मैन्युअल रूप से जांचने के लिए बहुत सारे परिणाम बदलता है? अन्यथा, मुझे यह जांचने के लिए कंपाइलर के लिए कोई रास्ता नहीं दिख रहा है। – arne
@arne समस्या का हिस्सा है, हां। – Henrik