आप इसके उपयोग पर भी विचार कर सकते हैं memmove Git 2.14.x (Q3 2017) में देखे गए
देखें प्रतिबद्ध 168e635 (16 जुला 2017), और 1,773,664 प्रतिबद्ध , f331ab9 प्रतिबद्ध , प्रतिबद्ध 5,783,980 से (15 जुला 2017) रेने Scharfe ( rscharfe) ।
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 32f9025 , 11 अगस्त 2017)
यह एक सहायक मैक्रोMOVE_ARRAY का उपयोग करता है जो हमारे लिए तत्वों की निर्दिष्ट संख्या के आधार पर आकार की गणना करता है और NULL
उस संख्या के शून्य होने पर पॉइंटर्स का समर्थन करता है।
रॉ memmove(3)कॉल के साथ NULLकंपाइलर (अति-उत्सुकता से) बाद में होने वाले NULLचेक को ऑप्टिमाइज़ कर सकता है ।
MOVE_ARRAYसरणी प्रविष्टियों की संभावित अतिव्यापी सीमाओं को स्थानांतरित करने के लिए एक सुरक्षित और सुविधाजनक सहायक जोड़ता है।
यह तत्व आकार को संक्रमित करता है, बाइट में आकार प्राप्त करने के लिए स्वचालित रूप से और सुरक्षित रूप से गुणा करता है, तत्व के आकार की तुलना करके एक बुनियादी प्रकार की सुरक्षा जांच memmove(3)करता है और इसके विपरीत अगर यह NULL0 तत्वों को स्थानांतरित करने के लिए पॉइंटर्स का समर्थन करता है ।
#define MOVE_ARRAY(dst, src, n) move_array((dst), (src), (n), sizeof(*(dst)) + \
BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
static inline void move_array(void *dst, const void *src, size_t n, size_t size)
{
if (n)
memmove(dst, src, st_mult(size, n));
}
उदाहरण :
- memmove(dst, src, (n) * sizeof(*dst));
+ MOVE_ARRAY(dst, src, n);
इसका उपयोग करता है मैक्रोBUILD_ASSERT_OR_ZERO जो एक बिल्ड-टाइम निर्भरता को अभिव्यक्त करता है, एक अभिव्यक्ति के रूप में ( @condसंकलन-समय की स्थिति के साथ जो सच होना चाहिए)।
यदि स्थिति सत्य नहीं है, या संकलनकर्ता द्वारा मूल्यांकन नहीं किया जा सकता है तो संकलन विफल हो जाएगा।
#define BUILD_ASSERT_OR_ZERO(cond) \
(sizeof(char [1 - 2*!(cond)]) - 1)
उदाहरण:
#define foo_to_char(foo) \
((char *)(foo) \
+ BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))